[Newbies] [Q] How can I write down my FFI method for this C
function? (Sorry if duplicated)
Levente Uzonyi
leves at elte.hu
Fri Mar 4 16:52:58 UTC 2011
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
>
More information about the Beginners
mailing list