web-dev-qa-db-fra.com

Erreur Utilisation non valide de l'expression vide

J'ai une fonction int rt_task_start (RT_TASK *task, void(*task_func)(void *arg), void *arg) Où, au deuxième argument, je passe une fonction avec un argument. 

  1. Quand je ne passe qu'un nom de fonction à ce moment-là, il n'y a pas de problème (comme prévu, cela fonctionne). rt_task_start(&demo_task1, demo, 1);
  2. Mais lorsque je passe rt_task_start(&demo_task1, demo(&val), 1);, il me donne l’erreur error: invalid use of void expression. La variable val est définie auparavant. int val = 0;
  3. Quand j'appelle avec cette rt_task_start(&demo_task1, demo(val), 1); cela montre l'erreur Warning passing argument 1 of 'demo' makes pointer from integer without a cast puis error: invalid use of void expression.
  4. int *val; *val = 0;rt_task_start(&demo_task1, demo(&val), 1); cela me donne aussi une erreur.

Je ne peux pas comprendre ce que je devrais passer, en tant que pointeur vide. Cela me donne une erreur. Toute idée s'il vous plaît!

5
Arun Gupta
void (*task_func)(void *arg);

L'instruction ci-dessus définit task_func comme étant un pointeur sur une fonction qui prend un pointeur de type void * et ne renvoie aucune valeur. 

Par conséquent, lorsque vous appelez votre fonction rt_task_start, vous devez passer un pointeur sur une fonction en tant que second argument. En outre, vous devez passer un pointeur de type void * en tant que troisième argument, et non un entier. Un nom de fonction correspond à un pointeur sur la fonction. Vous pouvez donc simplement passer le nom de la fonction comme valeur d'argument ou utiliser l'opérateur address-of & avant le nom de la fonction. 

int arg = 4;

// both calls are equivalent

rt_task_start(&demo_task1, demo, &arg);
rt_task_start(&demo_task1, &demo, &arg);
5
ajay

Je ne sais pas comment le code dans (1) peut éventuellement être compilé. Mais voici ce que vous devriez utiliser:

int rt_task_start (RT_TASK *task, void(*task_func)(void *arg), void *arg);
int val = 1;
rt_task_start(&demo_task1, demo, &val);

Vous ne pouvez pas transmettre le pointeur de fonction lié à un argument spécifique, qui ressemble à une fermeture, qui n’est pas disponible en C. Vous pouvez cependant passer le pointeur de la fonction puis transmettre séparément l’argument que vous la signature de fonction suggère que vous devriez faire). Mais vous devez transmettre cet argument sous forme de pointeur et non de littéral.

0
Jeremy West

Vous voulez sûrement:

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

En faisant simplement correspondre les types d'argument, souvenez-vous que le deuxième argument est juste un pointeur de fonction, pas un appel de fonction avec son propre argument, son propre argument n'est utilisé que lorsque vous l'appelez dans rt_task_demo. Si vous voulez ensuite utiliser la valeur '1' dans la fonction 'rt_task_demo', vous devrez la reformuler comme ceci:

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