P
Paul E Johnson
Dear friends in C:
I'm completely baffled by this problem I have with
printf statements and conditional operators in C.
I'm using gcc-3.3.
I have a project where the rarely used Union type
is called for! Incredible, but true.
union mixed
{
long unsigned int i;
double f;
} newMem;
It is no trouble to retrieve the values with newMem.i or newMem.f.
However, I want to make the choice between the two automatic by writing a
macro like this, which keys on the value of a variable "Stochastic":
#define UMACRO(var) ((Stochastic) ? var.i : var.f )
So if Stochastic ==1 then I want to get back newMem.i,
otherwise I want newMem.f.
I get this psychotic behavior. WHen the macro UMACRO is in a
printf statement, things go completely berserk!
Here's a code snip:
printf("newMem = %lu \n", newMem.i);
printf("Stochastic=%d, UMACRO = %lu Stochastic = %d \n",Stochastic,
UMACRO(newMem), Stochastic);
{
long unsigned int testval = UMACRO(newMem);
printf("testval %lu\n", testval);
}
And here's the output it produces when Stochastic==1 and
newMem.i = 97:
newMem = 97
Stochastic=1, UMACRO = 0 Stochastic = 1079525376
testval 97
When you look at the ouptut in line 2, you figure UMACRO
does not work at all, and it does something horrible affect
the printout of the second Stochastic in that line. However,
note the 3rd line, which is produced by first retrieving the value from
the union and then printing it out. That is correct.
I was thinking that the problem is the pre-processor, but
here is the output from gcc -E, which appears as expected.
printf("newMem = %lu \n", newMem.i);
printf("Stochastic=%d, UMACRO = %lu Stochastic = %d \n",Stochastic,
((Stochastic)?newMem.i:newMem.f ), Stochastic);
{long unsigned int testval = ((Stochastic)?newMem.i:newMem.f );
printf("testval %lu\n", testval);}
So maybe the ternary conditional is not working in the
right hand side of the printf? Is that a known thing? And
why does it make the output of the second Stochastic in line 2 turn into
crapola 1079525376.
???
I'm completely baffled by this problem I have with
printf statements and conditional operators in C.
I'm using gcc-3.3.
I have a project where the rarely used Union type
is called for! Incredible, but true.
union mixed
{
long unsigned int i;
double f;
} newMem;
It is no trouble to retrieve the values with newMem.i or newMem.f.
However, I want to make the choice between the two automatic by writing a
macro like this, which keys on the value of a variable "Stochastic":
#define UMACRO(var) ((Stochastic) ? var.i : var.f )
So if Stochastic ==1 then I want to get back newMem.i,
otherwise I want newMem.f.
I get this psychotic behavior. WHen the macro UMACRO is in a
printf statement, things go completely berserk!
Here's a code snip:
printf("newMem = %lu \n", newMem.i);
printf("Stochastic=%d, UMACRO = %lu Stochastic = %d \n",Stochastic,
UMACRO(newMem), Stochastic);
{
long unsigned int testval = UMACRO(newMem);
printf("testval %lu\n", testval);
}
And here's the output it produces when Stochastic==1 and
newMem.i = 97:
newMem = 97
Stochastic=1, UMACRO = 0 Stochastic = 1079525376
testval 97
When you look at the ouptut in line 2, you figure UMACRO
does not work at all, and it does something horrible affect
the printout of the second Stochastic in that line. However,
note the 3rd line, which is produced by first retrieving the value from
the union and then printing it out. That is correct.
I was thinking that the problem is the pre-processor, but
here is the output from gcc -E, which appears as expected.
printf("newMem = %lu \n", newMem.i);
printf("Stochastic=%d, UMACRO = %lu Stochastic = %d \n",Stochastic,
((Stochastic)?newMem.i:newMem.f ), Stochastic);
{long unsigned int testval = ((Stochastic)?newMem.i:newMem.f );
printf("testval %lu\n", testval);}
So maybe the ternary conditional is not working in the
right hand side of the printf? Is that a known thing? And
why does it make the output of the second Stochastic in line 2 turn into
crapola 1079525376.
???