7

タイプstructPersonのデータをリンクリストに渡しているので、各ノードのデータポインターはstructPersonを指しています。

struct Person {
char name[16];
char text[24];
};

リストをトラバースし、を呼び出して各ノードの名前/テキストを出力しようとしています

traverse(&list, &print);

トラバースのプロトタイプは次のとおりです。

void traverseList(struct List *list, void (*f)(void *));   

リストは次のように定義されます。

struct List {
struct Node *head;
};

私の印刷関数はvoid*データを受け入れます:

print(void *data) { .... }

Personを構築するためにデータをキャストする必要があることを知っていますよね?

struct Person *person = (struct Person *)data;
printf("%s", person->name);

「互換性のないポインタ型からの初期化」という警告が表示されるので、これでは不十分です。この場合、どうすればvoid *を正常にキャストできますか?ありがとうございました。

4

3 に答える 3

3

問題はキャストにあるのではなく、関数を渡す方法にもありません。問題は、の宣言にprint戻りタイプがないことです。この場合int、通常は想定されます。int (*)(void*)を期待している関数にを渡しているため、コンパイラは文句を言っていますvoid (*)(void*)

修正は簡単です。関数宣言voidの前に追加するだけです。print見る:

https://gist.github.com/ods94065/5178095

于 2013-03-16T19:46:41.080 に答える
1

私の印刷関数はvoid*データを受け入れます

printを受け入れて関数を書き直してくださいstruct Person *

于 2013-03-16T19:22:01.853 に答える
0

traverseList関数は関数ポインター(voidポインターを取ります)を受け入れますが、そのvoidデータの引数を受け入れません。これがあなたが求めているもののようです:

void print (void* data)
{
    printf("%s", ((struct Person*)data)->name);
}

void traverseList (struct List *list, void(*f)(void*), void* data)
{
    f(data);
}

次に、traverseListを呼び出すことができます。

traverseList (&list, &print, &person);
于 2013-03-16T19:42:32.200 に答える