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