4

さまざまな種類のパラメータをとることができる関数ポインタが欲しいです。それ、どうやったら出来るの?

void (*fp)(int)次の例(1行目)も取り上げたいと思いvoid (*fp)(char*)ます。次のコードは、intが期待される場所にchar *を渡しているため、正しくコンパイルされません。したがって、次のコードをコンパイルすると、警告が表示されます(正しく機能しません)。

void callIt(void (*fp)(int))
{
    (*fp)(5);
}

void intPrint(int x)
{
    printf("%d\n", x);
}

void stringPrint(char *s)
{
    printf("%s\n", s);
}

int main()
{
    void (*fp1)(int) = intPrint;
    callIt(fp1);
    void (*fp2)(char*) = stringPrint;
    callIt(fp2);
    return 0;
}

注:整数5をchar *パラメーターとして渡そうとするのはばかげていることは知っていますが、それはこの質問の問題ではありません。必要に応じて、char*をfloatに置き換えることができます。

4

4 に答える 4

3

を使用void (*fp)(void*)してから、変数へのポインターを渡し、それらをvoid*としてキャストします。かなりハッキーですが、動作するはずです。

例えば:

void callIt(void (*fp)(void*))
{
    int x = 5;
    (*fp)((void*)&x);
}
于 2012-07-19T14:24:42.620 に答える
1

stringPrintの呼び出しが正確に何をすることを期待しますか?

これを機能させると、メモリ位置5の内容を文字列として出力しようとするように見えます。クラッシュするので、これはあなたが望むものではないと私は思うし、あなたはそれが「5」を出力することを意図していたのではないかと思う。

...には少なくとも1つの名前付き引数が必要であることに注意してください。void *と不正な量のキャストを渡すと、少なくともコンパイルされます。

于 2012-07-19T14:25:42.270 に答える
1

良くはありませんが、関数ポインタのタイプは実際には重要ではありません。

ただそれを次のように定義します

typedef void (*fp_t)(void * pv);

あなたが確認しなければならない唯一のことは、あなたがそれを呼び出す方法があなたがそれに割り当てる関数と一致するということです。

int intFuncWithTwoDoubles(double d1, double d2);
char * pCharFuncWithIntAndPointer(int i, void * pv);

...

fp_t fp = NULL;

fp = intFuncWithTwoDoubles;
printf("%d", fp(0.0, 1.0));

fp = pCharFuncWithIntAndPointer;
printf("%s", fp(1, NULL));

...
于 2012-07-19T14:31:15.007 に答える
0

void *パラメータを受け入れる関数ポインタにしてみませんか?

void(*fp)(void*) 

これにより、可能なすべてのポインタパラメータが処理されます。これで、データ型について、関数ポインター型ごとに1つ作成するか、関数ポインターで使用される関数に対してのみ作成し、データ型をポインターとして渡し、関数の先頭でそれらを逆参照することができます。それはあなたが何をしたいのかを正確に知らなくてもただの考えです。

于 2012-07-19T14:26:45.920 に答える