Another test: I replaced double by integer, for visibility... typedef struct vec3 { int data[3]; } vec3;
add a second vec3 to position: typedef struct position { int i; vec3 vec; vec3 vec2; } position; Now in pharo: Position >> fieldsDesc "self rebuildFieldAccessors" ^ #( int i; Vec3 vec; Vec3 vec2; ) The size returned for each stucture is 16 instead of 12 that because of the "8 byte alignment" Meaning that the "position" structure is corrupted. With this function: extern "C" void DLL_EXPORT fillStruct(position *position) { position -> i = 19; (position -> vec).data[0] = 1; (position -> vec).data[1] = 2; (position -> vec).data[2] = 3; (position -> vec2).data[0] = 1; (position -> vec2).data[1] = 2; (position -> vec2).data[2] = 3; } We will get: position i == 19 position vec at: 1 == 1 position vec2 at: 1 == 2 On Tue, Jul 5, 2016 at 3:12 PM, Ronie Salgado <ronies...@gmail.com> wrote: > I compiled the DLL using Visual Studio 2015 Community Edition. Later I > will check with mingw. > > 2016-07-05 14:58 GMT+02:00 Merwan Ouddane <merwanoudd...@gmail.com>: > >> Using codeblocks, mine are: >> >> mingw32-g++.exe -m32 -DBUILD_DLL -c main.cpp -o obj\Release\main.o >> mingw32-g++.exe -shared -Wl,--output-def=bin\Release\libTest.def >> -Wl,--out-implib=bin\Release\libTest.a -Wl,--dll obj\Release\main.o -o >> bin\Release\Test.dll -s -m32 >> >> >> On Tue, Jul 5, 2016 at 2:52 PM, Merwan Ouddane <merwanoudd...@gmail.com> >> wrote: >> >>> I am not moving from another plateform :/ >>> >>> I tried it in pharo 6 and I it didn't work either. >>> >>> It could be my dll. What is your compilation line for the dll ? >>> >>> Thanks you, >>> Merwan >>> >>> On Tue, Jul 5, 2016 at 2:14 PM, Ronie Salgado <ronies...@gmail.com> >>> wrote: >>> >>>> Hi Merwan, >>>> >>>> I tested this on Pharo 6 and it is working in Windows. However, in 32 >>>> bits Window doubles have an 8 byte alignment, unlike Linux where they have >>>> a 4 byte alignment. >>>> >>>> Can you try doing the following before performing the ffi call in >>>> Windows, if you are moving an image from Linux or OS X: >>>> >>>> Vec3 rebuildFieldAccessors. >>>> Position rebuildFieldAccessors. >>>> >>>> Best regards, >>>> Ronie >>>> >>>> 2016-07-05 11:11 GMT+02:00 Merwan Ouddane <merwanoudd...@gmail.com>: >>>> >>>>> Hi, >>>>> >>>>> I have an issue whith nested structures. >>>>> >>>>> I made some "dummy" structures in c: >>>>> >>>>> >>>>> typedef struct vec3 { >>>>> double data[3]; >>>>> } vec3; >>>>> >>>>> typedef struct position { >>>>> int i; >>>>> vec3 vec; >>>>> } position; >>>>> And a "dummy" function to fill it: >>>>> void fillStruct(position *position) >>>>> { >>>>> position -> i = 19; >>>>> (position -> vec).data[0] = 1; >>>>> (position -> vec).data[1] = 2; >>>>> (position -> vec).data[2] = 3; >>>>> } >>>>> >>>>> But I can't make the nested structure work. >>>>> The "i" is correctly set to 19 but I have values that doesn't make any >>>>> sense in the vec3 structure. >>>>> >>>>> In Pharo >>>>> I declared the Double3 type for the array inside Vec3: >>>>> Double3 := FFITypeArray ofType: 'double' size: 3 >>>>> >>>>> Vec3>>fieldsDesc >>>>> ^ #( >>>>> Double3 v; >>>>> ) >>>>> >>>>> And the position: >>>>> Position>>fieldsDesc >>>>> ^ #( >>>>> int i; >>>>> Vec3 vec; >>>>> ) >>>>> >>>>> The ffi call: >>>>> ^ self ffiCall: #(void fillStruct(Position *position)) module: >>>>> 'Test.dll' >>>>> >>>>> Sorry for the long / messy mail :p >>>>> >>>>> Any clues ? >>>>> >>>>> Cheers, >>>>> Merwan >>>>> >>>> >>>> >>> >> >