I spoke too fast ^^'

struct Test {
  void * ptr;
  insigned long i;
  insigned long j;
}

Real size is 12, UFFI counts 24

Merwan

Le 7 juil. 2016 10:02, "Merwan Ouddane" <merwanoudd...@gmail.com> a écrit :

> Now it is working, thank you :)
>
> On Thu, Jul 7, 2016 at 8:42 AM, Esteban Lorenzano <esteba...@gmail.com>
> wrote:
>
>> Hi,
>>
>> > On 07 Jul 2016, at 01:54, Ben Coman <b...@openinworld.com> wrote:
>> >
>> > 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 ?
>>
>> FFIExternalType class>>sizeOf: ?
>>
>> but that does not works for complex type sizes (like FFIExternalArray).
>>
>> I don’t know what the problem is here, because in my test (attached) it
>> seems to be working fine.
>> maybe problem is on how the Vec3 array is created, it should be something
>> like this:
>>
>> Vec3 class>>iinitialize
>>         self
>>                 type: (FFIExternalType resolveType: 'double')
>>                 size: 3
>>
>> (is like that because FFITypeArray is more designed to be used creating
>> anonymous types than concretes, but well… )
>>
>> in any case, it seems to be working for me.
>>
>> Now, about the use…
>>
>> doing this:
>>
>> p := Position new.
>> p v1 at: 1 put: 42.0.
>> p v1 at: 1. “will print 0.0"
>>
>> why? because it works making a copy (maybe it should work passing a
>> segment, as nested structs work, but this is how it works now).
>>
>> What should work (at doesn’t) in this case is this:
>>
>> v := Vector3 new.
>> p := Position new.
>> v at: 1 put: 42.0.
>> p v1: v.
>> p v1 at: 1. “will print 42.0"
>>
>> it does not work because I made a mistake in field generation that I
>> already fixed… so you will need to update UFFI (and regenerate field
>> accessors) ;)
>>
>> also… I will provide a fix to make first case work… just later because
>> now I’m going to my french lessons :)
>>
>> Esteban
>>
>> ps: for future reference, a description of: install this, run that, is a
>> lot easier to understand the problem (is a case of “show me the code!”) :P
>>
>>
>>
>>
>> >
>> > 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