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 quand je passe rt_task_start(&demo_task1, demo(&val), 1); ça me donne une erreur error: invalid use of void expression . La variable val est définie auparavant. int val = 0;
  3. Quand j’appelle avec ce rt_task_start(&demo_task1, demo(val), 1); Cela Warning passing argument 1 of 'demo' makes pointer from integer without a cast une 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!

 void (*task_func)(void *arg); 

L’instruction ci-dessus définit task_func comme 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 * 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 en tant que 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); 

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 souhaitez appliquer 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.

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

 int ii = *(int*) arg;