question about FFI
Hi ! I'm trying to call a very simple function from C ++ lib, writed for the test. function with prototype: extern "C" float interpolationFunc(float* xm, float* ym, int size, float x). In Pharo7 wrote: FFIExamples class >> interpolationFunc_xm: xM ym: yM size: size x: x ^ self ffiCall: #(float interpolationFunc #(float * xM , float * yM , int size , float x)) module: 'libinterpolationLib.so' in Playground i'm doing: xm := FFIExternalArray externalNewType: 'float' size: 2. ym := xm clone. #(2 3) doWithIndex: [:each :i | xm at: i put: each]. #(3 4) doWithIndex: [:each :i | ym at: i put: each]. FFIExamples interpolationFunc_xm: xm pointer ym: ym pointer size: 2 x: 2.5 . last expression returninп me 0.0, but right is 3.5. I'm dit the same in Python3 ctypes, and there work's fine. In UnifiedFFI booklet is absent chapter "Arrays", anybody may help with whot i'm doing wrong?
Hi, could be the problem that you are using the same external array for both xm and ym?. The clone message just creates a shallow copy of the external array. It does not allocates a new external array, it only copies the address in both xm and ym. You should better do something like this: xm := FFIExternalArray externalNewType: 'float' size: 2. ym := FFIExternalArray externalNewType: 'float' size: 2. Cheers. On Mon, Nov 26, 2018 at 9:30 AM Yuriy Babah <babah.yuriy06@gmail.com> wrote:
Hi !
I'm trying to call a very simple function from C ++ lib, writed for the test. function with prototype:
extern "C" float interpolationFunc(float* xm, float* ym, int size, float x).
In Pharo7 wrote: FFIExamples class >> interpolationFunc_xm: xM ym: yM size: size x: x ^ self ffiCall: #(float interpolationFunc #(float * xM , float * yM , int size , float x)) module: 'libinterpolationLib.so'
in Playground i'm doing: xm := FFIExternalArray externalNewType: 'float' size: 2. ym := xm clone. #(2 3) doWithIndex: [:each :i | xm at: i put: each]. #(3 4) doWithIndex: [:each :i | ym at: i put: each]. FFIExamples interpolationFunc_xm: xm pointer ym: ym pointer size: 2 x: 2.5 .
last expression returninп me 0.0, but right is 3.5.
I'm dit the same in Python3 ctypes, and there work's fine.
In UnifiedFFI booklet is absent chapter "Arrays", anybody may help with whot i'm doing wrong?
-- Pablo Tesone. tesonep@gmail.com
Thank, i'm trued do this, and i'm got aBoxedFloat64 4.5879913020458836e-41 , which is still a very strange value пн, 26 ноÑб. 2018 г. в 12:33, tesonep@gmail.com <tesonep@gmail.com>:
Hi,
could be the problem that you are using the same external array for both xm and ym?. The clone message just creates a shallow copy of the external array. It does not allocates a new external array, it only copies the address in both xm and ym.
You should better do something like this:
xm := FFIExternalArray externalNewType: 'float' size: 2. ym := FFIExternalArray externalNewType: 'float' size: 2.
Cheers.
On Mon, Nov 26, 2018 at 9:30 AM Yuriy Babah <babah.yuriy06@gmail.com> wrote:
Hi !
I'm trying to call a very simple function from C ++ lib, writed for the test. function with prototype:
extern "C" float interpolationFunc(float* xm, float* ym, int size, float x).
In Pharo7 wrote: FFIExamples class >> interpolationFunc_xm: xM ym: yM size: size x: x ^ self ffiCall: #(float interpolationFunc #(float * xM , float * yM , int size , float x)) module: 'libinterpolationLib.so'
in Playground i'm doing: xm := FFIExternalArray externalNewType: 'float' size: 2. ym := xm clone. #(2 3) doWithIndex: [:each :i | xm at: i put: each]. #(3 4) doWithIndex: [:each :i | ym at: i put: each]. FFIExamples interpolationFunc_xm: xm pointer ym: ym pointer size: 2 x: 2.5 .
last expression returninп me 0.0, but right is 3.5.
I'm dit the same in Python3 ctypes, and there work's fine.
In UnifiedFFI booklet is absent chapter "Arrays", anybody may help with whot i'm doing wrong?
-- Pablo Tesone. tesonep@gmail.com
just in case, and https://www.virustotal.com/ru/file/738460bb6be71b4615581dad1a787cbb80b188e52... пн, 26 ноÑб. 2018 г. в 12:50, Yuriy Babah <babah.yuriy06@gmail.com>:
Thank, i'm trued do this, and i'm got aBoxedFloat64 4.5879913020458836e-41 , which is still a very strange value
пн, 26 ноÑб. 2018 г. в 12:33, tesonep@gmail.com <tesonep@gmail.com>:
Hi,
could be the problem that you are using the same external array for both xm and ym?. The clone message just creates a shallow copy of the external array. It does not allocates a new external array, it only copies the address in both xm and ym.
You should better do something like this:
xm := FFIExternalArray externalNewType: 'float' size: 2. ym := FFIExternalArray externalNewType: 'float' size: 2.
Cheers.
On Mon, Nov 26, 2018 at 9:30 AM Yuriy Babah <babah.yuriy06@gmail.com> wrote:
Hi !
I'm trying to call a very simple function from C ++ lib, writed for the test. function with prototype:
extern "C" float interpolationFunc(float* xm, float* ym, int size, float x).
In Pharo7 wrote: FFIExamples class >> interpolationFunc_xm: xM ym: yM size: size x: x ^ self ffiCall: #(float interpolationFunc #(float * xM , float * yM , int size , float x)) module: 'libinterpolationLib.so'
in Playground i'm doing: xm := FFIExternalArray externalNewType: 'float' size: 2. ym := xm clone. #(2 3) doWithIndex: [:each :i | xm at: i put: each]. #(3 4) doWithIndex: [:each :i | ym at: i put: each]. FFIExamples interpolationFunc_xm: xm pointer ym: ym pointer size: 2 x: 2.5 .
last expression returninп me 0.0, but right is 3.5.
I'm dit the same in Python3 ctypes, and there work's fine.
In UnifiedFFI booklet is absent chapter "Arrays", anybody may help with whot i'm doing wrong?
-- Pablo Tesone. tesonep@gmail.com
in Playground i'm doing:
#(2 3) doWithIndex: [:each :i | xm at: i put: each]. #(3 4) doWithIndex: [:each :i | ym at: i put: each].
Yuriy Babah wrote * *
whot i'm doing wrong?
So, you're putting 2 at index 2 of xm, and then writing 3 past end of array, and in ym you're putting 3 and 4 at offsets past the end of array? It's a wonder your image didn't crash, rather than return interpolation of the uninitialized values... Cheers, Henry -- Sent from: http://forum.world.st/Pharo-Smalltalk-Users-f1310670.html
Nevermind me, hadn't had my coffee yet, for some reason I didn't see it was doWithIndex: you were using :/ Still a bit scary that FFIExternalArray at:put: doesn't perform bounds checks... Cheers, Henry -- Sent from: http://forum.world.st/Pharo-Smalltalk-Users-f1310670.html
Hi,
On 26 Nov 2018, at 09:28, Yuriy Babah <babah.yuriy06@gmail.com> wrote:
Hi !
I'm trying to call a very simple function from C ++ lib, writed for the test. function with prototype:
extern "C" float interpolationFunc(float* xm, float* ym, int size, float x).
In Pharo7 wrote: FFIExamples class >> interpolationFunc_xm: xM ym: yM size: size x: x ^ self ffiCall: #(float interpolationFunc #(float * xM , float * yM , int size , float x)) module: 'libinterpolationLib.so'
in Playground i'm doing: xm := FFIExternalArray externalNewType: 'float' size: 2. ym := xm clone. #(2 3) doWithIndex: [:each :i | xm at: i put: each]. #(3 4) doWithIndex: [:each :i | ym at: i put: each]. FFIExamples interpolationFunc_xm: xm pointer ym: ym pointer size: 2 x: 2.5 .
This is incorrect. âxmâ and âymâ are already pointers (references) When you pass "xm pointerâ you are actually passing a pointer to a pointer (a float** in this case) This looks better: FFIExamples interpolationFunc_xm: xm getHandle ym: ym getHandle size: 2 x: 2.5 . Still, you need to do something with those arrays after using them, since you are creating them with externalNewType:⦠(which mean it allocates the memory space). You will need to send #free to them. Other solution would be to not use #externalNewType:size: but plain #newType:size: Cheers, Esteban
last expression returninп me 0.0, but right is 3.5.
I'm dit the same in Python3 ctypes, and there work's fine.
In UnifiedFFI booklet is absent chapter "Arrays", anybody may help with whot i'm doing wrong?
participants (4)
-
Esteban Lorenzano -
Henrik Sperre Johansen -
tesonep@gmail.com -
Yuriy Babah