Ncurses Benutzer Pointer
-
19-09-2019 - |
Frage
Ich versuche ncurses zu lernen, und ich lese die hervorragende Führung hier , aber das Beispiel unter Benutzer Zeiger nicht kompilieren. Ich bekomme diese Fehlermeldung, wenn ich versuche zu kompilieren.
menu.cpp: In function 'int main()':
menu.cpp:44: error: invalid conversion from 'void (*)(char*)' to 'void*'
menu.cpp:44: error: initializing argument 2 of 'int set_item_userptr(ITEM*, void*)'
menu.cpp:70: error: invalid conversion from 'void*' to 'void (*)(char*)'
Außerdem müssen Sie wahrscheinlich cstdlib hinzufügen und cstring für die mit strlen und calloc kompilieren.
Ich weiß nicht viel über void-Zeiger, so dass einige Hilfe das Beispiel Festsetzung würde sehr geschätzt werden.
Danke
Lösung
Von der manuellen Seite zu lesen:
#include <menu.h>
int set_item_userptr(ITEM *item, void *userptr);
void *item_userptr(const ITEM *item);
Beschreibung
Jeder Menüpunkt hat ein Feld, das verwendet werden kann, anwendungsspezifische Daten zu halten (das heißt, der Menü-Treiber-Code läßt sie allein). Diese Funktionen erhalten und dieses Feld gesetzt.
userptr
ist benutzerspezifischen Daten, die Sie liefern sollten set_item_userptr()
. Wenn Sie keine Daten liefern wollen, sollten Sie NULL
liefern. Sieht aus wie Sie set_item_userptr()
mit einem Zeiger auf eine Funktion als zweites Argument nennen. Es ist nicht garantiert, dass Sie einen Funktionszeiger umwandeln können void *
und zurück portably, entweder in C oder in C ++ (C ++ erfordert eine Besetzung, wenn ein void *
zu jedem anderen Zeigertyp Umwandlung). Ohne zu wissen, was Sie zu tun versuchen, wenn Sie wirklich einen Funktionszeiger übergeben müssen, sollten Sie es in dem entsprechenden Typ werfen:
int ret = set_item_userptr(item, reinterpret_cast<void *>(ptr));
void (*pf)(char*);
pf = reinterpret_cast<void (*)(char *)>(item_userptr(item));
, aber es ist nicht garantiert. Sie sollten etwas anderes tun, wie eine struct
aufweist, die den Funktionszeiger enthält, und einen Zeiger auf die struct
zu set_item_userptr()
vorbei.
Andere Tipps
Sie verwenden einen C ++ Compiler, so was Sie tun müssen:
set_item_userptr(my_items[i], (void *)func);
wieder
p = (void*)item_userptr(cur);