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