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
>>>>>
>>>>
>>>>
>>>
>>
>

Reply via email to