Ncurses pointeur de l'utilisateur
-
19-09-2019 - |
Question
Je suis en train d'apprendre ncurses, et je lis le guide formidable ici , mais l'exemple pointeurs de l'utilisateur ne compiler. Je reçois cette erreur lorsque je tente de compiler.
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*)'
En outre, vous avez probablement besoin d'ajouter cstdlib et cstring pour que compiler avec strlen et calloc.
Je ne sais pas grand-chose au sujet des pointeurs vides, donc une aide fixer l'exemple serait très apprécié.
Merci
La solution
À la lecture de la page de manuel:
#include <menu.h>
int set_item_userptr(ITEM *item, void *userptr);
void *item_userptr(const ITEM *item);
DESCRIPTION
Chaque élément de menu a un champ qui peut être utilisé pour contenir des données spécifiques à l'application (qui est, le code-pilote de menu laisse seul). Ces fonctions get et set ce champ.
userptr
est des données spécifiques à l'utilisateur que vous devez fournir à set_item_userptr()
. Si vous ne voulez pas fournir des données, vous devez fournir NULL
. On dirait que vous appelez set_item_userptr()
avec un pointeur vers une fonction comme second argument. Il est pas garanti que vous pouvez convertir une fonction pointeur vers void *
et le dos portably, que ce soit en C ou en C ++ (C ++ nécessite une distribution lors de la conversion d'un void *
à tout autre type de pointeur). Sans savoir ce que vous essayez de faire, si vous avez vraiment besoin de passer un pointeur de fonction, vous devez jeter dans le type approprié:
int ret = set_item_userptr(item, reinterpret_cast<void *>(ptr));
void (*pf)(char*);
pf = reinterpret_cast<void (*)(char *)>(item_userptr(item));
mais il est pas garanti. Vous devriez faire quelque chose d'autre, comme avoir un struct
qui contient le pointeur de fonction, et le passage d'un pointeur vers le struct
à set_item_userptr()
.
Autres conseils
Vous utilisez un compilateur C ++, de sorte que vous devez faire:
set_item_userptr(my_items[i], (void *)func);
et encore,
p = (void*)item_userptr(cur);