在编译基本 OptionMenu 示例时分配给“Widget”的不兼容整数到指针转换

问题描述

我正在尝试使用 OptionMenu Motif Widget 编译一个基本窗口。

这是我试过的:

#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,&argc,argv,0);

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


        /* CREATE OPTIONS MENU */
        ac=0;
        optionMenu = XmCreateOptionMenu(toplevel,"optionMenu",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,ac);
                   ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1 warning generated.

当我尝试执行它时它会生成一个核心转储:

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

因为我总是在没有警告的情况下编译东西,所以我想了解为什么会出现该警告并首先将其消除。

编辑:

评论中所述,添加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,ac);


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


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

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)