how do you declare this?

> On 08 Jul 2016, at 10:01, Merwan Ouddane <merwanoudd...@gmail.com> wrote:
> 
> 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 
> <mailto: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 
> <mailto: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 
> > <mailto: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 
> >> <mailto: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 
> >>> <mailto: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 
> >>>> <mailto: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 
> >>>>> <mailto: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 
> >>>>>> <mailto: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