[Newbies] [Q] How can I write down my FFI method for this C function? (Sorry if duplicated)

Sungjin Chun chunsj at gmail.com
Fri Mar 4 22:17:48 UTC 2011


Ah, I got it. Then, I can use your suggestion or modify/fix the function to use float instead of double. :-)

Thank you very much.

On Mar 5, 2011, at 1:52, Levente Uzonyi <leves at elte.hu> wrote:

> On Fri, 4 Mar 2011, Sungjin Chun wrote:
> 
>> Hi,
>> 
>> The C function is like this;
>> 
>> BOOL ComputeVector (int startIdx, int endIdx, double *inputSeries, int
>> duration, int *outBeginIdx, int *outNBElement, double *outSeries);
>> 
>> My trial method is
>> 
>> apiComputeVectorWith: startIdx with: endIdx with: input duration:
>> duration with: outBeginIdx with: outNBElement out: out
>>  <cdecl: bool 'ComputeVector' (long long double* long long* long* double*)>
>> 
>> But with these input variable, I got error with "could not coerce arguments".
>> 
>> input := ((1 to: 100) collect: [ :i | i ]) asFloatArray.
>> startIdx := 0.
>> endIdx := input size - 1.
>> duration := 4.
>> outBeginIndx := IntegerArray new: 1.
>> outNBElement := IntegerArray new: 1.
>> out := FloatArray new: input size.
>> computer apiComputeVectorWith: startIdx with: endIdx with: input
>> duration: duration with: outBeginIdx with: outNBElement out: out.
>> 
>> Can anyone help me on this? Thank you in advance.
> 
> The cause of the error is that FloatArray is an array of 32-bit floats (unlike Float which is a 64-bit floating point number aka double).
> Your method expects double*. AFAIK there's no Smalltalk type that matches double*, so you have to coerce the arguments yourself.
> Here's how you can do it (I didn't try it, so it may not work):
> 
> "We will pass WordArrays, since Floats consist of two words, which makes coercion easy."
> 
> apiComputeVectorWith: startIdx with: endIdx with: input duration:
> duration with: outBeginIdx with: outNBElement out: out
>   <cdecl: bool 'ComputeVector' (long long long* long long* long* long*)>
> 
> input := WordArray new: 200.
> 1 to: 100 do: [ :i |
>    | float |
>    float := i asFloat.
>    input at: 2 * i - 1 put: (float at: 1).
>    input at: 2 * i put: (float at: 2) ]
> startIdx := 0.
> endIdx := input size - 1.
> duration := 4.
> outBeginIndx := IntegerArray new: 1.
> outNBElement := IntegerArray new: 1.
> out := WordArray new: input size.
> computer apiComputeVectorWith: startIdx with: endIdx with: input duration: duration with: outBeginIdx with: outNBElement out: out.
> out := out pairsCollect: [ :word1 :word2 |
>    (Float new: 2)
>        at: 1 put: word1;
>        at: 2 put: word2;
>        yourself ]
> 
> 
> Levente
> 
>> _______________________________________________
>> Beginners mailing list
>> Beginners at lists.squeakfoundation.org
>> http://lists.squeakfoundation.org/mailman/listinfo/beginners
>> 
> _______________________________________________
> Beginners mailing list
> Beginners at lists.squeakfoundation.org
> http://lists.squeakfoundation.org/mailman/listinfo/beginners


More information about the Beginners mailing list