0

私はncursesを学ぼうとしていて、ここで素晴らしいガイドを読んでいますが、ユーザーポインターの例はコンパイルされません。コンパイルしようとすると、このエラーが発生します。

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

また、strlenとcallocでコンパイルするには、おそらくcstdlibとcstringを追加する必要があります。

ボイドポインタについてはよくわからないので、例を修正するのに役立つ情報をいただければ幸いです。

ありがとう

4

2 に答える 2

2

C ++コンパイラを使用しているため、次のことを行う必要があります。

    set_item_userptr(my_items[i], (void *)func);

そしてまた、

    p = (void*)item_userptr(cur);
于 2010-02-09T08:12:52.697 に答える
2

マニュアルページを読むことから:

#include <menu.h>
int set_item_userptr(ITEM *item, void *userptr);
void *item_userptr(const ITEM *item);

説明

すべてのメニュー項目には、アプリケーション固有のデータを保持するために使用できるフィールドがあります (つまり、メニュー ドライバー コードはそれをそのままにしておきます)。これらの関数は、そのフィールドを取得および設定します。

userptrに提供する必要があるユーザー固有のデータですset_item_userptr()。データを提供したくない場合は、 を提供する必要がありますNULLset_item_userptr()関数へのポインタを 2 番目の引数として呼び出しているようです。C または C++ のいずれかで、関数ポインターを移植可能に変換したり、元に戻したりできることは保証されていませんvoid *(C++ では、avoid *を他のポインター型に変換するときにキャストが必要です)。何をしようとしているのかわからなくても、本当に関数ポインターを渡す必要がある場合は、適切な型にキャストする必要があります。

int ret = set_item_userptr(item, reinterpret_cast<void *>(ptr));
void (*pf)(char*);
pf = reinterpret_cast<void (*)(char *)>(item_userptr(item));

ただし、動作することは保証されていません。関数ポインタを含む を持ち、 tostructへのポインタを渡すなど、別のことを行う必要があります。structset_item_userptr()

于 2010-02-09T08:34:21.407 に答える