Ponteiro do usuário do NCURSES
-
19-09-2019 - |
Pergunta
Estou tentando aprender Ncurses e estou lendo o ótimo guia aqui, mas o exemplo em Ponteiros de usuário não compila. Recebo esse erro quando tento compilar.
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*)'
Além disso, você provavelmente precisa adicionar CSTDLIB e CSTRING para que isso compile com Strlen e Calloc.
Não sei muito sobre os indicadores vazios, então alguns ajudam a consertar o exemplo seria muito apreciado.
Obrigado
Solução
Ao ler a página manual:
#include <menu.h>
int set_item_userptr(ITEM *item, void *userptr);
void *item_userptr(const ITEM *item);
DESCRIÇÃO
Cada item de menu possui um campo que pode ser usado para conter dados específicos do aplicativo (ou seja, o código de driver de menu deixa-o sozinho). Essas funções obtêm e definem esse campo.
userptr
são dados específicos do usuário que você deve fornecer para set_item_userptr()
. Se você não quiser fornecer nenhum dado, deve fornecer NULL
. Parece que você está ligando set_item_userptr()
com um ponteiro para uma função como seu segundo argumento. Não é garantido que você pode converter um ponteiro de função para void *
e de volta portavelmente, em C ou em C ++ (C ++ requer um elenco ao converter um void *
para qualquer outro tipo de ponteiro). Sem saber o que você está tentando fazer, se você realmente precisar passar por um ponteiro de função, você deve lançá -lo para o tipo apropriado:
int ret = set_item_userptr(item, reinterpret_cast<void *>(ptr));
void (*pf)(char*);
pf = reinterpret_cast<void (*)(char *)>(item_userptr(item));
Mas não é garantido trabalhar. Você deve fazer outra coisa, como ter um struct
que contém o ponteiro da função e passando um ponteiro para o struct
para set_item_userptr()
.
Outras dicas
Você está usando um compilador C ++, então precisará fazer:
set_item_userptr(my_items[i], (void *)func);
e de novo,
p = (void*)item_userptr(cur);