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

Reply via email to