3

関数ポインターを受け取り、それを別の関数に渡すマッピング関数を作成しようとしていますが、gcc が怒鳴っています。

これが私がやろうとしていることのアイデアです。

void map(T thing, void apply(int a, int b, void *cl), void *cl);

void function(T thing, void apply(int a, int b, void *cl), void * cl)
{

   for(int i = 0; i < 10; i++)
   {

      map(thing, apply, cl);

   }

}

gcc の苦情:

警告: 互換性のないポインタ型から 'map' の引数 2 を渡しています

何か案は?

4

4 に答える 4

4

この問題を解決するには、マップ関数の宣言/署名を確認する必要があります。ほとんどの場合、関数シグネチャにわずかな違いがあります。これを解決する最も簡単な方法は、関数ポインター型を型定義し、それを両方の関数で使用することです。

typedef void (*apply)(int,int,void*);
于 2009-10-03T19:08:36.577 に答える
2

関数を渡すことはできません。代わりに、関数へのポインターを渡す必要があります。

void map(T thing, void (*apply)(int a, int b, void *cl), void *cl);
void function(T thing, void (*apply)(int a, int b, void *cl), void * cl)
{
    /* ... */
    map(thing, apply, cl);
    /* .... */
}
于 2009-10-03T19:25:50.187 に答える
0

gcc 4.3.3 と-Wall.

これまでに存在した C のすべてのバージョンは、関数の「値」パラメーターをポインターに書き換えたと思いますが、より伝統的な宣言を使用できます。

void function(T thing, void (*f)(int a, int b, void *cl), void * cl)

しかし、私が言ったように、あなたの例は私にとってはうまくいきますtypedef int T.map(1, ...)

于 2009-10-03T19:30:06.253 に答える
0

の 2 番目の引数で期待される関数ポインタの型が のmapそれとは異なると不平を言っているだけですapply。その型を変更するか、(安全であれば) キャストすれば問題ありません。

于 2009-10-03T19:07:32.930 に答える