Passing Floats by Value
- Posted by David Guy <dguy at MINDSPRING.COM> Jan 19, 2000
- 395 views
Hi, I have a routine in a DLL defined as such: EXPORT VOID CALLBACK myFunc( float f0, float f1 ) { printf("%f %f\n", f0, f1 ); } I "link" to it from Euphoria like so ('m_DLL' is valid): constant m_myFunc = define_c_proc( m_DLL, "_myFunc@8", {C_FLOAT, C_FLOAT}) when I call the routine: c_proc( m_myFunc, {1.0, 1.0} ) the following prints out: 0.000000 0.000000 If I change *JUST* 'C_FLOAT' to 'C_DOUBLE' like so: constant m_myFunc = define_c_proc( m_DLL, "_myFunc@8", {C_DOUBLE,C_DOUBLE}) the output becomes: 0.000000 1.875000 Lastly, if I change *ALL* 'float' to 'double' and *ALL* 'C_FLOAT' 'to C_DOUBLE' like so: EXPORT VOID CALLBACK myFunc( double d0, double d1 ) { printf("%f %f\n", d0, d1 ); } constant m_myFunc = define_c_proc( m_DLL, "_myFunc@16",{C_DOUBLE,C_DOUBLE}) the output becomes, as expected: 1.000000 1.000000 Now, I'm sure the above has to do with the fact that an ATOM is 8-bytes, and it *APPEARS* Euphoria is passing 8-bytes per parameter to a routine that is expecting 4-bytes per parameter. So the question is: How do I pass a 4-byte floating point value from Euphoria to a C routine? (The above code is just a mock up to demonstate my dilemma, in reality the DLL routine I wish to pass data to is pre-compiled and I don't have access to the source code, so if I can't figure out how to pass a float, I can't use the DLL.) Thanks In Advance, David