web-dev-qa-db-ja.com

エラーvoid式の無効な使用

私は関数int rt_task_start (RT_TASK *task, void(*task_func)(void *arg), void *arg)を持っています。ここで、2番目の引数で、引数付きの関数を渡しています。

  1. そのときに関数名のみを渡すと問題はありません(期待どおりに機能しています)。 rt_task_start(&demo_task1, demo, 1);
  2. しかし、rt_task_start(&demo_task1, demo(&val), 1);を渡すと、エラー_error: invalid use of void expression_が発生します。変数valは以前に定義されています。 _int val = 0;_
  3. これで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_が表示されます。
  4. _int *val; *val = 0;_ rt_task_start(&demo_task1, demo(&val), 1);これもエラーになります。

Voidポインタとして、何を渡すべきか理解できません。エラーが発生しています。任意のアイデアしてください!

8
Arun Gupta
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);
6
ajay

(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では使用できないクロージャーのようなものです。ただし、関数ポインターを渡してから、適用する引数を個別に渡すことができます(これは、関数のシグネチャは、あなたがすべきことを示唆しています)。ただし、その引数はリテラルではなくポインタとして渡す必要があります。

0
Jeremy West

きっとあなたは欲しい:

  int i=1;
  rt_task_start(&demo_task1, demo, (void*) &i);

引数の型を一致させるだけで、2番目の引数は単なる関数ポインタであり、独自の引数を持つ関数呼び出しではないことに注意してください。独自の引数は、rt_task_demo内で呼び出す場合にのみ使用されます。その後、関数「rt_task_demo」で値「1」を使用する場合は、次のように再キャストします

int ii = *(int*) arg;
0
user3353819