Sorry not unsigned longs but enumerations On Fri, Jul 8, 2016 at 10:09 AM, Esteban Lorenzano <esteba...@gmail.com> wrote:
> 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> 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 >>> <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 >>> >>>>>> >>> >>>>>> >>> >>>>> >>> >>>> >>> >>> >>> >> >>> >> >>> > >>> >>> >>> >> >