2012-01-17 15 views
0

私は関数コールバックのためのメカニズムを開発しました。これが私の機能です。そうC.関数ポインタのコールバック。プロトタイプとの非互換性。

int function_root(var1,var2, int(*callback)(), ...);
VAR1 = var2の次いでコールバック(のva_argリスト)場合。例えば

function_root(A、B、fun_clbck、X、Y、Z)。 // a = b
の場合、これは次のようになります。fun_clbk(x、y、z);

問題があります。私の関数コールバックに少なくとも1つの引数があるとき。私は警告を受けるプロトタイプとの非互換性

私の問題は私の機能ルートにあると思う。私はint(* callback)()をゼロパラメータで宣言し、fun_clbck(int、int、int)のようなコールバックを実行すると、その問題を引き起こします。

+0

@larsmans私はここで解決策を見つけました。このような関数コールバックをキャストする必要があります。------------------------------- --- function_root(a、b、(int(*)())fun_clbk、x、y、z); – Aymanadou

答えて

2

を私は真実ではないゼロパラメータ

int(*callback)()を宣言しました。 int(*callback)()はC89/C99プロトタイプではありません。パラメータの型を指定せずに、intを返す関数ポインタを宣言します。引数なしの関数ポインタのための適切な宣言が

int (*callback)(void) 

だろうと私はfun_clbck(int,int,int);のようなコールバックを行うたら、それは明らかにその問題

を誘発します。コールバック関数用に宣言されたパラメータ型は、呼び出し時のパラメータ型と一致しなければなりません。デザインを再考する可変数の引数を使用します。

int (*callback)(unsigned, ...) 

第1引数に実際の引数の数を渡します。

+0

がありません。この場合はfunction_rootコールバックをどのように書くべきですか? – Aymanadou

+0

'function_root(n_args、...)'は、実際のパラメータを ''のマクロで取得します。 –

0

可変引数リスト(stdarg.h)を使用してパラメータを渡します。この

EDITなどのhttp://www.cplusplus.com/reference/clibrary/cstdarg/

何かを参照してください。

template <typename T> 
int mycallback(unsigned amount, ...){ 
    int i; 
    T val; 
    va_list vl; 
    va_start(vl,amount); 
    for (i=0;i<amount;i++){ 
    val+=va_arg(vl,T); 
    } 
    va_end(vl); 
}; 

template <typename T> 
int function_root(int var1, int var2, int(*callback)(unsigned, ...)<T>, unsigned amount, ...){ 
    if (var1 == var2) 
    return callback<T>(amount, ...); 
}; 
+1

OPはCを使用していますが、レスポンスにはC++ – nos

0

関数ポインタ

int (*callback)() 

intを返す不特定型のパラメータの不特定数の関数へのポインタです。

intを返し、固定数のパラメータを返す関数へのポインタを保持できます。

int foo(int a, int b, int c) 
{ 
    return 0; 
} 

int (*callback)() = foo; 

例えば

はOKです。

しかし、関数のパラメータの数は固定する必要があります。変数にすることはできません(省略記号(...)表記のプロトタイプで関数を渡すことはできません)。

関連する問題