2010-02-09 4 views
0

J'essaie d'apprendre ncurses, et je lis le guide fantastique here, mais l'exemple à user pointers ne compile pas. J'ai cette erreur quand j'essaye de compiler.Ncurses User Pointer

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*)'

De plus, vous devez probablement ajouter cstdlib et cstring pour que compiler avec strlen et calloc. Je ne connais pas beaucoup de pointeurs de vide, donc une aide pour fixer l'exemple serait très appréciée.

Merci

Répondre

2

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 possède un champ qui peut être utilisé pour stocker des données spécifiques à l'application (c'est-à-dire que le code du gestionnaire de menus le laisse seul). Ces fonctions obtiennent et définissent ce champ.

userptr est des données spécifiques à l'utilisateur que vous devez fournir à set_item_userptr(). Si vous ne souhaitez pas fournir de données, vous devez fournir NULL. On dirait que vous appelez set_item_userptr() avec un pointeur sur une fonction comme deuxième argument. Il n'est pas garanti que vous pouvez convertir un pointeur de fonction en void * et revenir en arrière, soit en C ou en C++ (C++ requiert une conversion lors de la conversion d'un void * en n'importe quel 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 passer un pointeur au struct à set_item_userptr().

+0

Ce que j'essaye de faire est de faire un menu qui exécutera une fonction quand j'appuie sur entrer dans la sélection. – Reti

+0

@Reti: Je ne connais pas les malédictions, mais je suppose qu'il devrait y avoir une meilleure façon de faire ce que vous voulez faire que de lancer un pointeur de fonction sur 'void *'. –

2

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); 
+0

Qu'en est-il de l'erreur sur la ligne 70? – Reti

+1

Deux commentaires. 1 - Je recommanderais reinterpret_cast <> comme meilleur style que le style C. 2 - ligne 70 est le cast inversé donc la distribution devrait être 'p = reinterpret_cast (item_userptr (cur));' –

+0

Pourquoi 'reinterpret_cast' si' static_cast' à 'void *' et retour est bien? –