On Thu, Jul 7, 2016 at 12:58 AM, Merwan Ouddane <merwanoudd...@gmail.com> wrote:
> PS: for the first example, the alignment is not respected, the vec3
> structure is starting at 9 but uffi is fetching it at 5

Hi Esteban,

Is it possible to get a feature or a recipe to output the sizeof or
offset of fields in types as understood by the Image, and the same
from a C side - that could be used as the standard first step in
troubleshooting these kinds of issues ?

cheers -ben

>
>
> On 06/07/2016 17:55, Merwan Ouddane wrote:
>
> 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