Несовместимое преобразование целого числа в указатель, присвоенное «Виджету» при компиляции базового примера OptionMenu

Я пытаюсь скомпилировать базовое окно с виджетом OptionMenu Motif.

Вот что я пробовал:

#include <Xm/Xm.h>
#include <Xm/PushB.h>

XtAppContext    context;
XmStringCharSet char_set=XmSTRING_DEFAULT_CHARSET;

Widget          toplevel;
Widget          optionMenu;
Widget          optionMenuItem1;
Widget          optionMenuItem2;

Widget addMenuItem(char *itemName, XtPointer clientData, Widget menuWidget) {

        int ac;
        Arg al[10];
        Widget item;

        ac=0;
        XtSetArg(al[ac],XmNlabelString, XmStringCreateLtoR(itemName, char_set)); ac++;
        item=XmCreatePushButton(menuWidget,itemName,al,ac);
        XtManageChild(item);
        /*XtAddCallback(item,XmNactivateCallback,menuCB,clientData);*/
        XtSetSensitive(item,True);
        return(item);

}

int main(int argc, char *argv[]){

        Arg             al[10];
        int             ac;

        /* CREATE TOP LEVEL */
        toplevel = XtAppInitialize(&context, "test1", NULL, 0, &argc, argv, NULL, NULL, 0);

        /* RESIZE TOP LEVEL */
        ac=0;
        XtSetArg(al[ac], XmNheight, 300); ac++;
        XtSetArg(al[ac], XmNwidth, 300); ac++;
        XtSetValues(toplevel, al, ac);


        /* CREATE OPTIONS MENU */
        ac=0;
        optionMenu = XmCreateOptionMenu(toplevel, "optionMenu", al, ac);
        XtManageChild(optionMenu);
        optionMenuItem1 = addMenuItem("item1", "Item 1", optionMenu);
        optionMenuItem2 = addMenuItem("item2", "Item 2", optionMenu);


        /* DISPLAY TOP LEVEL */
        XtRealizeWidget(toplevel);
        XtAppMainLoop(context);
}

Это предупреждение о компиляции, которое я получаю, и я не знаю, почему оно его дает:

$ cc -std=c89 test1.c -I/usr/local/include -L/usr/local/lib -lXm -lXt -lX11
test1.c:45:13: warning: incompatible integer to pointer conversion assigning to 'Widget' (aka 'struct _WidgetRec *') from 'int' [-Wint-conversion]
        optionMenu = XmCreateOptionMenu(toplevel, "optionMenu", al, ac);
                   ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1 warning generated.

И он генерирует дамп ядра, когда я пытаюсь его выполнить:

$ ./a.out
Segmentation fault (core dumped)

Поскольку я всегда компилирую вещи без предупреждений, я хочу понять, почему появляется это предупреждение, и сначала избавиться от него.

Изменить:

Как упоминалось в комментариях, добавление ‹Xm/RowColumn.h›, указанного на справочной странице xmcreateoptionmenu, устраняет проблему.

Кроме того, код для создания меню опций неверен, я прикрепляю правильный. Обратите внимание, что виджету не назначена метка:

#include <Xm/Xm.h>
#include <Xm/PushB.h>
#include <Xm/RowColumn.h>

XtAppContext    context;
XmStringCharSet char_set=XmSTRING_DEFAULT_CHARSET;

Widget          toplevel;
Widget          pulldownMenu, optionMenu;
Widget          optionMenuItem1;
Widget          optionMenuItem2;

Widget addMenuItem(char *itemName, XtPointer clientData, Widget menuWidget) {

        int ac;
        Arg al[10];
        Widget item;

        ac=0;
        XtSetArg(al[ac],XmNlabelString, XmStringCreateLtoR(itemName, char_set)); ac++;
        item=XmCreatePushButton(menuWidget,itemName,al,ac);
        XtManageChild(item);
        /*XtAddCallback(item,XmNactivateCallback,menuCB,clientData);*/
        XtSetSensitive(item,True);
        return(item);

}

int main(int argc, char *argv[]){

        Arg             al[10];
        int             ac;

        /* CREATE TOP LEVEL */
        toplevel = XtAppInitialize(&context, "test1", NULL, 0, &argc, argv, NULL, NULL, 0);

        /* RESIZE TOP LEVEL */
        ac=0;
        XtSetArg(al[ac], XmNheight, 300); ac++;
        XtSetArg(al[ac], XmNwidth, 300); ac++;
        XtSetValues(toplevel, al, ac);


        /* CREATE OPTIONS MENU */
        pulldownMenu=XmCreatePulldownMenu(toplevel, "pulldownMenu",NULL,0);
        optionMenuItem1 = addMenuItem("item1", "Item 1", pulldownMenu);
        optionMenuItem2 = addMenuItem("item2", "Item 2", pulldownMenu);
        ac=0;
        XtSetArg(al[ac], XmNsubMenuId, pulldownMenu); ac++;
        optionMenu = XmCreateOptionMenu(toplevel, "optionMenu", al, ac);
        XtManageChild(optionMenu);


        /* DISPLAY TOP LEVEL */
        XtRealizeWidget(toplevel);
        XtAppMainLoop(context);
}

person M.E.    schedule 17.01.2021    source источник
comment
Для предупреждения попробуйте добавить #include <Xm/RowColumn.h>, как указано на справочной странице.   -  person kaylum    schedule 17.01.2021
comment
Добавьте -Wall -Wextra. Обратите внимание, что C89 допускает неявные объявления функций, и это не ошибка! Я не уверен, зачем вам вообще нужна компиляция с параметром -std=c89, если нет действительно плохого кода, основанного на неявных объявлениях функций, и вы не можете *rsed, чтобы исправить это... Предложите -std=c99, c11, c17...   -  person Antti Haapala    schedule 17.01.2021
comment
согласно ответу, поскольку вы не включили заголовок, компилятор C89 услужливо сделал вывод, что вы хотите вызвать функцию неявно, объявленную как extern int XmCreateOptionMenu();. И поскольку возвращаемые типы не совпадают, компилятор C считает, что было возвращено int, и пытается преобразовать 32-битный int в 64-битный? указатель.   -  person Antti Haapala    schedule 17.01.2021
comment
Спасибо за ваши комментарии и пояснения, отредактированный исходный вопрос содержит исправленный код как для компиляции, так и для самого OptionMenu, который был неправильно закодирован.   -  person M.E.    schedule 17.01.2021