I have got a problem with my funtion to convert an array to float. I use the "Debug" to see the value of my variables. The problem is in the multiplication on the second element of array fd[1] only when there is a "7","8" or "9", for example to convert "070000" the value of bux=4464, for others value the funtion works perfectly.
float Conv_C2F_FE(unsigned char fd[6]) {float bux; bux=(fd[0]-0x30)*100000; bux=bux+(fd[1]-0x30)*10000; bux=bux+(fd[2]-0x30)*1000; bux=bux+(fd[3]-0x30)*100; bux=bux+(fd[4]-0x30)*10; bux=bux+(fd[5]-0x30); return bux; }
"The problem is in the multiplication on the second element of array fd[1] only when there is a '7','8' or '9' You are multiplying by 10,000. Think about what "magic number" occurs between 6*10000 and 7*10000... Hint: 16 bits...
It is left as an exercise for the student to determine why you don't get a problem multiplying by 100,000...
I don't think that this will be the wrong thing, because if i do 6.8*10000 the funtion works, and if i want to convert the number "458693" bux=458693. and i need to convert to a float. do you thing that could be a mistake of C51? wha can i do?. thanks for you reply.
"because if i do 6.8*10000 the funtion works" But that is a floating-point expression, isn't it? "do you thing that could be a mistake of C51?" No it's a mistake in your code. Remember, the 'C' programming language assumes that everything is an int unless stated otherwise. 10,000 can be expressed as an int, so it will be evaluated as an int; (fd[1]-0x30) will be promoted to int, then the expression
bux=bux+(fd[1]-0x30)*10000;
bux=bux+(fd[1]-0x30)*10000L;
Thanks you are a genius! we have been 3 person asking for why didn't work, now seems so easy. thank you very much. Ruben.
Why don't you just use sscanf()?
You know, there is a library function (strtod) that does exactly what you want. http://www.keil.com/support/man/docs/c51/c51_strtod.htm Jon
"You know, there is a library function (strtod) that does exactly what you want." Well, maybe not exactly. Being a 'C' string function, it requires a null terminator. This may or may not match the requirement...