RE: How can I pass an atom to a C function as C float or double
- Posted by euman at bellsouth.net Sep 13, 2003
- 311 views
<?xml version="1.0" ?><html> <head> <title></title> </head> <body> <div align="left"><font face="Arial"><span style="font-size:10pt">On 12 Sep 2003 at 22:31, Elliott Sales de Andrade wrote:</span></font></div> <div align="left"><br/> </div> <div align="left"><font face="Arial" color="#7f0000"><span style="font-size:10pt">> > > On 12 Sep 2003 at 23:27, myotis at xnet.ro wrote:</span></font></div> <div align="left"><font face="Arial" color="#7f0000"><span style="font-size:10pt">> > ></span></font></div> <div align="left"><font face="Arial" color="#7f0000"><span style="font-size:10pt">> > > > Please tell me how can I pass an atom as a C float to a C</span></font></div> <div align="left"><font face="Arial" color="#7f0000"><span style="font-size:10pt">> > > > function from a dll. The same question is for a C double ...</span></font></div> <div align="left"><font face="Arial" color="#7f0000"><span style="font-size:10pt">> > > ></span></font></div> <div align="left"><font face="Arial" color="#7f0000"><span style="font-size:10pt">> > > > Example of the C function in DLL :</span></font></div> <div align="left"><font face="Arial" color="#7f0000"><span style="font-size:10pt">> > > ></span></font></div> <div align="left"><font face="Arial" color="#7f0000"><span style="font-size:10pt">> > > > float MyFunction( float parameter1, double parameter2 );</span></font></div> <div align="left"><font face="Arial" color="#7f0000"><span style="font-size:10pt">> > > ></span></font></div> <div align="left"><font face="Arial" color="#7f0000"><span style="font-size:10pt">> > > > I have tried all the posible combinations ( C_FLOAT in define the C</span></font></div> <div align="left"><font face="Arial" color="#7f0000"><span style="font-size:10pt">> > > > function, atom_to_float32 when I pass the arguments ... nothing work )</span></font></div> <div align="left"><font face="Arial" color="#7f0000"><span style="font-size:10pt">> > > ></span></font></div> <div align="left"><font face="Arial" color="#7f0000"><span style="font-size:10pt">> > > > Please write to me a little piece of euphoria code that call this</span></font></div> <div align="left"><font face="Arial" color="#7f0000"><span style="font-size:10pt">> > > > function in Euphoria. Also tell me the calling convention you are </span></font></div> <div align="left"><font face="Arial" color="#7f0000"><span style="font-size:10pt">> >write</span></font></div> <div align="left"><font face="Arial" color="#7f0000"><span style="font-size:10pt">> > > > for ...</span></font></div> <div align="left"><font face="Arial" color="#7f0000"><span style="font-size:10pt">> > > > I can change this in my DLL as I want.</span></font></div> <div align="left"><font face="Arial" color="#7f0000"><span style="font-size:10pt">> > > ></span></font></div> <div align="left"><font face="Arial" color="#7f0000"><span style="font-size:10pt">> > > > Also, please tell me if the version of euphoria you are</span></font></div> <div align="left"><font face="Arial" color="#7f0000"><span style="font-size:10pt">> > > > writeing for the example, matter for some reason.</span></font></div> <div align="left"><font face="Arial" color="#7f0000"><span style="font-size:10pt">> > > ></span></font></div> <div align="left"><font face="Arial" color="#7f0000"><span style="font-size:10pt">> > > > Thank you !</span></font></div> <div align="left"><font face="Arial" color="#7f0000"><span style="font-size:10pt">> > ></span></font></div> <div align="left"><font face="Arial" color="#7f0000"><span style="font-size:10pt">> > > Can you try this:</span></font></div> <div align="left"><font face="Arial" color="#7f0000"><span style="font-size:10pt">> > ></span></font></div> <div align="left"><font face="Arial" color="#7f0000"><span style="font-size:10pt">> > > integer junk</span></font></div> <div align="left"><font face="Arial" color="#7f0000"><span style="font-size:10pt">> > > junk = allocate(5)</span></font></div> <div align="left"><font face="Arial" color="#7f0000"><span style="font-size:10pt">> > > poke(junk, atom_to_float32(x))</span></font></div> <div align="left"><font face="Arial" color="#7f0000"><span style="font-size:10pt">> > > poke4(junk+1, atom_to_float64(y))</span></font></div> <div align="left"><font face="Arial" color="#7f0000"><span style="font-size:10pt">> > ></span></font></div> <div align="left"><font face="Arial" color="#7f0000"><span style="font-size:10pt">> </span></font></div> <div align="left"><font face="Arial" color="#7f0000"><span style="font-size:10pt">> What is this??</span></font></div> <div align="left"><font face="Arial" color="#7f0000"><span style="font-size:10pt">> Firstly, junk is a memory address, so it should be an atom.</span></font></div> <div align="left"><font face="Arial" color="#7f0000"><span style="font-size:10pt">> Secondly, atom_to_float32() returns 4 bytes, not 1, so the subsequent poke </span></font></div> <div align="left"><font face="Arial" color="#7f0000"><span style="font-size:10pt">> will overwrite it.</span></font></div> <div align="left"><font face="Arial" color="#7f0000"><span style="font-size:10pt">> Thirdly, atom_to_float64() returns 8 bytes, times 4, making 32, which </span></font></div> <div align="left"><font face="Arial" color="#7f0000"><span style="font-size:10pt">> wouldn't fit in the allocated 5.</span></font></div> <div align="left"><font face="Arial" color="#7f0000"><span style="font-size:10pt">> Fourthly, you don't even need pointers.</span></font></div> <div align="left"><font face="Arial" color="#7f0000"><span style="font-size:10pt">> </span></font></div> <div align="left"><br/> </div> <div align="left"><font face="Arial" color="#7f0000"><span style="font-size:10pt">hmmm maybe I read this wrong....</span></font></div> <div align="left"><br/> </div> <div align="left"><font face="Arial" color="#7f0000"><span style="font-size:10pt">atom_to_float64() returns a sequence of 8 bytes - a C double. </span></font></div> <div align="left"><font face="Arial" color="#7f0000"><span style="font-size:10pt">Use poke(material, atom_to_float64(1.0)) to store the 8 bytes </span></font></div> <div align="left"><font face="Arial" color="#7f0000"><span style="font-size:10pt">in memory. </span></font></div> <div align="left"><br/> </div> <div align="left"><font face="Arial" color="#7f0000"><span style="font-size:10pt">poke4 will actually store 4*8 = 32 bytes - wrong. </span></font></div> <div align="left"><br/> </div> <div align="left"><font face="Arial" color="#7f0000"><span style="font-size:10pt">If you decide to use atom_to_float32() to store C *floats*, </span></font></div> <div align="left"><font face="Arial" color="#7f0000"><span style="font-size:10pt">you can also use poke() to store the 4 bytes.</span></font></div> <div align="left"><font face="Arial" color="#7f0000"><span style="font-size:10pt"> </span></font></div> <div align="left"><font face="Arial" color="#7f0000"><span style="font-size:10pt">Regards, </span></font></div> <div align="left"><font face="Arial" color="#7f0000"><span style="font-size:10pt">Rob Craig </span></font></div> <div align="left"><font face="Arial" color="#7f0000"><span style="font-size:10pt">Rapid Deployment Software </span></font></div> <div align="left"><font face="Arial" color="#7f0000"><span style="font-size:10pt">http://www.RapidEuphoria.com </span></font></div> <div align="left"><br/> </div> <div align="left"><font face="Arial" color="#7f0000"><span style="font-size:10pt">Sure, so this would mean that I had not allocated enough space</span></font></div> <div align="left"><font face="Arial" color="#7f0000"><span style="font-size:10pt">"by 4 bytes". Elliot I want to thank you.</span></font></div> <div align="left"><br/> </div> <div align="left"><font face="Arial" color="#7f0000"><span style="font-size:10pt">Here is a quote of her problem</span></font></div> <div align="left"><br/> </div> <div align="left"><font face="Arial" color="#7f0000"><span style="font-size:10pt"><QUOTE></span></font></div> <div align="left"><br/> </div> <div align="left"><font face="Arial" color="#7f0000"><span style="font-size:10pt">My problem is how to give to the function in DLL a corect float value.</span></font></div> <div align="left"><font face="Arial" color="#7f0000"><span style="font-size:10pt">If I define the function as you say and I call the function</span></font></div> <div align="left"><br/> </div> <div align="left"><font face="Arial" color="#7f0000"><span style="font-size:10pt">atom x</span></font></div> <div align="left"><font face="Arial" color="#7f0000"><span style="font-size:10pt">atom y</span></font></div> <div align="left"><font face="Arial" color="#7f0000"><span style="font-size:10pt">x = 0.45</span></font></div> <div align="left"><font face="Arial" color="#7f0000"><span style="font-size:10pt">y = 0.4534 </span></font></div> <div align="left"><font face="Arial" color="#7f0000"><span style="font-size:10pt"> </span></font></div> <div align="left"><font face="Arial" color="#7f0000"><span style="font-size:10pt">Myfunction(x, y)</span></font></div> <div align="left"><br/> </div> <div align="left"><font face="Arial" color="#7f0000"><span style="font-size:10pt"> then the function in dll seems to receive anything else but not</span></font></div> <div align="left"><font face="Arial" color="#7f0000"><span style="font-size:10pt">0.45 value or 0.4534 ... ( even as a floting number ... )</span></font></div> <div align="left"><br/> </div> <div align="left"><font face="Arial" color="#7f0000"><span style="font-size:10pt">If I call</span></font></div> <div align="left"><font face="Arial" color="#7f0000"><span style="font-size:10pt">Myfunction(atom_to_float32(x), atom_toFloat64(y)) Euphoria</span></font></div> <div align="left"><font face="Arial" color="#7f0000"><span style="font-size:10pt">say that I can not pass a sequence to a C function ...</span></font></div> <div align="left"><font face="Arial" color="#7f0000"><span style="font-size:10pt">Diana.</span></font></div> <div align="left"><br/> </div> <div align="left"><font face="Arial" color="#7f0000"><span style="font-size:10pt"></QUOTE></span></font></div> <div align="left"><br/></div> <div align="left"><font face="Arial"><span style="font-size:10pt">So I thought immedialty she needed to have pointers setup in ram</span></font></div> <div align="left"><font face="Arial" color="#7f0000"><span style="font-size:10pt">to pass to her .DLL</span></font></div> <div align="left"><br/></div> <div align="left"><font face="Arial"><span style="font-size:10pt">Have a good day all,</span></font></div> <div align="left"><font face="Arial" color="#7f0000"><span style="font-size:10pt">Euman</span></font></div> <div align="left"><br/> </div> <div align="left"></div>