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.
rt_task_start(&demo_task1, demo, 1);
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;
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
.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 é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);
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.
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;