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