I have a function int rt_task_start (RT_TASK *task, void(*task_func)(void *arg), void *arg)
where in second argument i am passing a function with argument.
- When i only pass a function name at that time there is no problem.(as expected it's working).
rt_task_start(&demo_task1, demo, 1);
- But when i pass
rt_task_start(&demo_task1, demo(&val), 1);
it's giving me errorerror: invalid use of void expression
. Variable val is defined before.int val = 0;
- When i call with this
rt_task_start(&demo_task1, demo(val), 1);
this is showing errorWarning passing argument 1 of 'demo' makes pointer from integer without a cast
thenerror: invalid use of void expression
. int *val; *val = 0;
rt_task_start(&demo_task1, demo(&val), 1);
this is also giving me error.
I can't understand what should i pass, as a void pointer. It's giving me error. Any Idea Please!
I'm not sure how the code in (1) can possibly compile. But here is what you should be using:
You cannot pass the function pointer bound to a specific argument, that is something like a closure, which isn't available in C. You can, however, pass the function pointer and then separately pass the argument you want to apply (which is what the function signature suggests you should do). But you must pass that argument as a pointer, not a literal.
The above statement defines
task_func
to be a pointer to a function which takes a pointer of typevoid *
and returns no value.Therefore, when you call your function
rt_task_start
, you should pass a pointer to a function as the second argument. Also, you should pass a pointer of typevoid *
as the third argument, not an integer. A function name evaluates to a pointer to the function, so you can simply pass the function name as the argument value, or you can use the address-of operator&
before the function name.Surely you want:
Just by matching the argument types, remember the second argument is just a function pointer, not a function call with its own argument, it's own argument is only used when you call it within rt_task_demo. If you then want to use the value '1' in function 'rt_task_demo' you would recast it like