it works fine for me: 

Struct>>b
        "This method was automatically generated"
        ^Enum fromInteger: (handle unsignedLongAt: 5)

Struct>>b: anObject
        "This method was automatically generated"
        handle unsignedLongAt: 5 put: anObject value

Struct>>c
        "This method was automatically generated"
        ^Enum fromInteger: (handle unsignedLongAt: 9)

Struct>>c: anObject
        "This method was automatically generated"
        handle unsignedLongAt: 9 put: anObject value

question: did you initialise the Enum? before generating fields?

Esteban

> On 08 Jul 2016, at 20:42, Merwan Ouddane <merwanoudd...@gmail.com> wrote:
> 
> Struct >> fieldsDesc
>     ^#( void* a;
>     Enum b;
>     Enum c; 
>     )
> 
> Enum >> enumDecl
>     ^ #( TEST 1 )
> 
> I joined a .st with the struct and the enum, the package name is FFITest.
> 
> Merwan
> 
> On 08/07/2016 20:14, Esteban Lorenzano wrote:
>> that still does not helps… show me the code!
>> 
>> Esteban
>> 
>>> On 08 Jul 2016, at 20:09, Merwan Ouddane <merwanoudd...@gmail.com 
>>> <mailto:merwanoudd...@gmail.com>> wrote:
>>> 
>>> Sorry not unsigned longs but enumerations
>>> 
>>> On Fri, Jul 8, 2016 at 10:09 AM, Esteban Lorenzano <esteba...@gmail.com 
>>> <mailto:esteba...@gmail.com>> wrote:
>>> how do you declare this?
>>> 
>>>> On 08 Jul 2016, at 10:01, Merwan Ouddane <merwanoudd...@gmail.com 
>>>> <mailto: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 
>>>> > <mailto: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
>>>> >>>>>>
>>>> >>>>>>
>>>> >>>>>
>>>> >>>>
>>>> >>>
>>>> >>
>>>> >>
>>>> >
>>>> 
>>>> 
>>>> 
>>> 
>>> 
>> 
> 
> <FFITest.st>

Reply via email to