Как скомпилировать этот код, реализующий Xm на 64-разрядной версии Ubuntu с использованием Netbeans?

Я просто новичок в X-Windows и пытаюсь написать код, который просто вызывает простой MessageBox в Linux, например, в Window.

Я на Ubuntu 12.04LTS 64bit и установил полную версию Netbeans. Я включил «/usr/include/Xm» в этот проект, а для библиотек я включил библиотеки «Motif».

и при компиляции кода возникает следующая ошибка:

main.cpp:24:63: error: invalid conversion from ‘void (*)(Widget, XtPointer, XmPushButtonCallbackStruct*) {aka void (*)(_WidgetRec*, void*, XmPushButtonCallbackStruct*)}’ to ‘XtCallbackProc {aka void (*)(_WidgetRec*, void*, void*)}’ [-fpermissive]
/usr/include/X11/Intrinsic.h:1241:13: error:   initializing argument 3 of ‘void XtAddCallback(Widget, const char*, XtCallbackProc, XtPointer)’ [-fpermissive] 

Я действительно не понимаю эту ошибку, по крайней мере, я никогда не видел такого синтаксиса, как «ака пустота бла-бла~~».

Может ли кто-нибудь помочь мне исправить эту ошибку компиляции и, если возможно, объясните мне, что означает это сообщение об ошибке?

Вот оригинальный исходный код:

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

/* Prototype Callback function */

void pushed_fn(Widget , XtPointer , 
               XmPushButtonCallbackStruct *);


main(int argc, char **argv) 

{   Widget top_wid, button;
    XtAppContext  app;

    top_wid = XtVaAppInitialize(&app, "Push", NULL, 0,
        &argc, argv, NULL, NULL);

    button = XmCreatePushButton(top_wid, "Push_me", NULL, 0);

    /* tell Xt to manage button */
                XtManageChild(button);

                /* attach fn to widget */
    XtAddCallback(button, XmNactivateCallback, pushed_fn, NULL);

    XtRealizeWidget(top_wid); /* display widget hierarchy */
    XtAppMainLoop(app); /* enter processing loop */ 

}

void pushed_fn(Widget w, XtPointer client_data, 
               XmPushButtonCallbackStruct *cbs) 
  {   
     printf("Don't Push Me!!\n");
  }

person online.0227    schedule 26.08.2013    source источник


Ответы (1)


XtAddCallback ожидает XtCallbackProc Ваш pushed_fn может быть совместим, но это не XtCallbackProc, поскольку он напрямую использует типы Xm.

Прошло некоторое время с тех пор, как я сделал Motif, поэтому я могу ошибаться, но решение может быть таким:

void pushed_fn(Widget w, XtPointer client, XtPointer cbsXt)
{
    XmPushButtonCallbackStruct *cbs = (XmPushButtonCallbackStruct*)cbsXt;
    ...
}
person John3136    schedule 26.08.2013
comment
Спасибо очень хорошо собрал. Кроме того, вы знаете, как изменить размер окна? он всплывает в очень маленьком окне. - person online.0227; 26.08.2013
comment
Вы связали настройку его ширины и высоты? - это, вероятно, единственный подход, поскольку я не вижу менеджеров компоновки в вашем коде. - person John3136; 26.08.2013