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







FFIExternalEnumeration subclass: #FFITEnum
        instanceVariableNames: ''
        classVariableNames: 'TESTE'
        poolDictionaries: ''
        category: 'FFITest'!
"-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!

FFITEnum class
        instanceVariableNames: ''!

!FFITEnum class methodsFor: 'as yet unclassified' stamp: 'MerwanOuddane 
7/8/2016 20:07'!
enumDecl
        ^ #( TESTE 1 )! !


FFIExternalStructure subclass: #FFITStruct
        instanceVariableNames: ''
        classVariableNames: ''
        poolDictionaries: ''
        category: 'FFITest'!

!FFITStruct methodsFor: 'accessing structure variables' stamp: 'MerwanOuddane 
7/8/2016 20:38'!
a: anObject
        "This method was automatically generated"
        handle pointerAt: 1 put: anObject getHandle.! !

!FFITStruct methodsFor: 'accessing structure variables' stamp: 'MerwanOuddane 
7/8/2016 20:39'!
b
        "This method was automatically generated"
        ^FFITEnum fromInteger: (handle unsignedLongAt: 9)! !

!FFITStruct methodsFor: 'accessing structure variables' stamp: 'MerwanOuddane 
7/8/2016 20:38'!
b: anObject
        "This method was automatically generated"
        handle unsignedLongAt: 9 put: anObject value! !

!FFITStruct methodsFor: 'accessing structure variables' stamp: 'MerwanOuddane 
7/8/2016 20:38'!
a
        "This method was automatically generated"
        ^ExternalData fromHandle: (handle pointerAt: 1) type: ExternalType void 
asPointerType! !

!FFITStruct methodsFor: 'accessing structure variables' stamp: 'MerwanOuddane 
7/8/2016 20:38'!
c: anObject
        "This method was automatically generated"
        handle unsignedLongAt: 17 put: anObject value! !

!FFITStruct methodsFor: 'accessing structure variables' stamp: 'MerwanOuddane 
7/8/2016 20:39'!
c
        "This method was automatically generated"
        ^FFITEnum fromInteger: (handle unsignedLongAt: 17)! !

"-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!

FFITStruct class
        instanceVariableNames: ''!

!FFITStruct class methodsFor: 'as yet unclassified' stamp: 'MerwanOuddane 
7/8/2016 20:39'!
fieldsDesc
"
self rebuildFieldAccessors
"
        ^#( void* a;
        #FFITEnum b;
        #FFITEnum c; 
        )
         ! !


FFITStruct compileFields!

Reply via email to