On Mon, Oct 12, 2015 at 7:12 PM, Matt <[email protected]> wrote:
> What to use instead of pointer_from_objecf?
>
>
> reinterpret(Int32, Int64(10))
>
> gives
>
> ERROR: box: argument is of incorrect size
>
>
>  in reinterpret at essentials.jl:115
>

........ That's why I said

> Cast to a smaller integer first should work. (Although you might need
to worry a little about the endianess).

```
julia> reinterpret(Float32, Int64(0) % Int32)
0.0f0
```

>
> On Monday, October 12, 2015 at 6:52:12 PM UTC-4, Yichao Yu wrote:
>>
>> On Mon, Oct 12, 2015 at 6:46 PM, Matt <[email protected]> wrote:
>> > Ok. It works know. I was stuck to the last two lines. I defined
>> > is_system_missing::Cint
>> > is_considered_missing::Cint.
>> >
>> > instead of an UInt8
>> >
>> > A last question: I actually have the structure itself as an argument,
>> > not a
>> > pointer to the structure. Is the best way to convert v.union to the
>> > right
>> > type
>> > unsafe_load(convert(Ptr{T}, pointer_from_objref(val)))
>> > ?
>>
>> Don't use `pointer_from_objref`
>>
>> > The issue with reinterpret is that it fails when the new type fits in
>> > less
>> > than a 64-bit field
>>
>> Cast to a smaller integer first should work. (Although you might need
>> to worry a little about the endianess).
>>
>> >
>> > On Monday, October 12, 2015 at 3:55:53 PM UTC-4, Steven G. Johnson
>> > wrote:
>> >>
>> >>
>> >>
>> >> On Monday, October 12, 2015 at 3:30:18 PM UTC-4, Douglas Bates wrote:
>> >>>
>> >>> On Monday, October 12, 2015 at 11:24:06 AM UTC-5, Matt wrote:
>> >>>>
>> >>>> ReadStat is an excellent C library by Evan Millers that allows to
>> >>>> read
>> >>>> files from Stata, SPSS and SAS.
>> >>>> Evan wrote a wrapper for ReadStat in the Dataread.jl package
>> >>>> https://github.com/WizardMac/DataRead.jl
>> >>>> However, the package was not updated with the most recent API of
>> >>>> ReadStat.
>> >>>> I've been trying to solve this without success (see the WIP pull
>> >>>> request
>> >>>> in the repository)
>> >>>> The hard part is to write a Julia function (handle_value) that
>> >>>> accepts a
>> >>>> C structure with a union field.
>> >>>>
>> >>>> typedef struct readstat_value_s {
>> >>>>     union {
>> >>>>         char        char_value;
>> >>>>         float       float_value;
>> >>>>         double      double_value;
>> >>>>         int16_t     i16_value;
>> >>>>         int32_t     i32_value;
>> >>>>         char       *string_value;
>> >>>>     } v;
>> >>>>     readstat_types_t        type;
>> >>>>     char                    tag;
>> >>>>     int                     is_system_missing:1;
>> >>>>     int                     is_considered_missing:1;
>> >>>> } readstat_value_t;
>> >>
>> >>
>> >>
>> >> Something like the following should work, because the union types all
>> >> fit
>> >> into a 64-bit field and will be aligned as such:
>> >>
>> >> immutable readstat_value_t
>> >>    union::Int64
>> >>    typ::Cint # enum
>> >>    tag::Cchar
>> >>    bits::UInt8 # bitfield (first two bits are is_system_missing and
>> >> is_considered_missing)
>> >> end
>> >>
>> >> function handle_value(p::Ptr{readstat_value_t})
>> >>     v = unsafe_load(p)
>> >>     if v.tag == READSTAT_TYPE_DOUBLE
>> >>         value = unsafe_load(convert(Ptr{Cdouble}, p))
>> >>         ...do stuff...
>> >>     else if v.tag == READSTAT_TYPE_STRING
>> >>         value = bytestring(unsafe_load(convert(Ptr{Cchar}, p)))
>> >>         ... do stuff...
>> >>     else ...
>> >>        ....
>> >>     end
>> >> end
>> >>
>> >

Reply via email to