私は関数int rt_task_start (RT_TASK *task, void(*task_func)(void *arg), void *arg)
を持っています。ここで、2番目の引数で、引数付きの関数を渡しています。
rt_task_start(&demo_task1, demo, 1);
rt_task_start(&demo_task1, demo(&val), 1);
を渡すと、エラー_error: invalid use of void expression
_が発生します。変数valは以前に定義されています。 _int val = 0;
_rt_task_start(&demo_task1, demo(val), 1);
を呼び出すと、エラー_Warning passing argument 1 of 'demo' makes pointer from integer without a cast
_が表示され、次に_error: invalid use of void expression
_が表示されます。int *val; *val = 0;
_ rt_task_start(&demo_task1, demo(&val), 1);
これもエラーになります。Voidポインタとして、何を渡すべきか理解できません。エラーが発生しています。任意のアイデアしてください!
void (*task_func)(void *arg);
上記のステートメントでは、task_func
を、void *
型のポインターを受け取り、値を返さない関数へのポインターとして定義しています。
したがって、関数rt_task_start
を呼び出すときは、関数へのポインターを2番目の引数として渡す必要があります。また、3番目の引数として、整数ではなく、void *
型のポインターを渡す必要があります。関数名は関数へのポインターに評価されるため、関数名を引数値として単に渡すか、関数名の前にアドレス演算子&
を使用できます。
int arg = 4;
// both calls are equivalent
rt_task_start(&demo_task1, demo, &arg);
rt_task_start(&demo_task1, &demo, &arg);
(1)のコードがどのようにコンパイルできるかわかりません。しかし、これはあなたが使用すべきものです:
int rt_task_start (RT_TASK *task, void(*task_func)(void *arg), void *arg);
int val = 1;
rt_task_start(&demo_task1, demo, &val);
特定の引数にバインドされた関数ポインターを渡すことはできません。これは、Cでは使用できないクロージャーのようなものです。ただし、関数ポインターを渡してから、適用する引数を個別に渡すことができます(これは、関数のシグネチャは、あなたがすべきことを示唆しています)。ただし、その引数はリテラルではなくポインタとして渡す必要があります。
きっとあなたは欲しい:
int i=1;
rt_task_start(&demo_task1, demo, (void*) &i);
引数の型を一致させるだけで、2番目の引数は単なる関数ポインタであり、独自の引数を持つ関数呼び出しではないことに注意してください。独自の引数は、rt_task_demo内で呼び出す場合にのみ使用されます。その後、関数「rt_task_demo」で値「1」を使用する場合は、次のように再キャストします
int ii = *(int*) arg;