I am surprised by GCC (this is ver. 4.2.4, Ubuntu 32 bit Intel) when a function declares a float parameter and it's prototype is missing, the parameters are messed up.
Please see my code below:
~/test$ cat x1.c
#include <stdio.h>
#include <stdlib.h>
set_p(int p1, float p2, int p3, int p4)
{
printf("p1=%i\n", p1);
printf("p2=%.4f\n", p2);
printf("p3=%i\n", p3);
printf("p4=%i\n", p4);
return(0);
}
main(int argc, char *argv[])
{
float x1 = (argc == 2) ? atof(argv[1]) : 1.2345;
set_p(1, x1, 2, 3);
set_P(1, x1, 2, 3);
return(0);
}
~/test$ cat x2.c
#include <stdio.h>
set_P(int p1, float p2, int p3, int p4)
{
printf("p1=%i\n", p1);
printf("p2=%.4f\n", p2);
printf("p3=%i\n", p3);
printf("p4=%i\n", p4);
return(0);
}
I make it like this:
cc -c x1.c
cc -c x2.c
cc x1.o x2.o
The output:
~/test$ ./a.out
p1=1
p2=1.2345
p3=2
p4=3
p1=1
p2=0.0000
p3=1072939139
p4=2
As you see, the set_P function somehow messed up parameters.
***Note: the code does work on SCO with stock compiler on similar h/w.
If I add the function prototype to x1.c
int set_P(int , float , int , int );
then everything works correctly, no surprises.
My understanding is that compiler allocates longs for longs/integers/shorts and doubles for float/double when passing parametrs by value. Then if receiver function expects a float, it will get first 32 bit, which is OK on Intel. Apparently my understanding is not correct.
The code in many places lacks function prototypes, I wander if I can somehow influence compiler to pass float/double parameters and not mess up. Any ideas?