I have a problem with typedef union as parameter for a function-call.
definition of the typedef
union uParameter { byte bByte; // 8 bit unsigned int16 iInt16; // 16 bit signed int32 iInt32; // 32 bit signed }; typedef union uParameter USR_tu_Para;
prototype of a function that uses this typedef
void SetSomething(USR_tu_Para para);
The question is: how can I call the SetSomething-function with a constant parameter.
SetSomething(100);
This call creates a compiler error: #167: argument of type "int" is incompatible with parameter of type "USR_tu_Para"
I tried to cast the parameter witch (USR_tu_Para) or (USR_tu_Para.iInt16). But the compiler denied everything I tried.
Any ideas?
Just remember that the stricter data type checking you can use, the quicker you - or the next developer who may pick up this project - will catch goofs in the code.
With a union that doesn't have a field to say what type of info it contains, together with functions that "automatically" know what union member to pick up, you have completely nuked the compilers ability to track used data types. You could just as well switch to ugly typecasted pointers - yes, very ugly but at least a code reader would know he/she is in very, very dangerous terrain.
Hi Per, thanks for your reply. My first idea was to use void pointers. But finally I decided to reduce the risk a little bit.
I placed enough warnings in my code, that this corner should not be touched without switching on the brain before.
This is the definition of my pointer-array
void (*azfSet[IOACC_ATT_ANZ][5])(word, USR_tu_Parameter)
I hope this scares enough :-)
Anyway: it should be possible to pass a numeric value to a function with union as parameter (standard in c++ without any use of unions).
But finally I decided to reduce the risk a little bit.
But you didn't. That union is exactly as risky as passing stuff via (void *). Heck, even variable-number-of-arguments functions would be (slightly) safer than that!
Oh, and the only reason for anyone to be scared of a declaration an array of function pointers like this:
is that you decided against doing it in a much less confusing way, e.g.
#define MEANINGFUL_NAME 5 typedef void (*azfFunction_t)(word, USR_tu_Parameter); azfFunction_t azfSet[IOACC_ATT_ANZ][MEANINGFUL_NAME]