I ended up doing convert(Float32, reinterpret(Float64, x)), which does the 
job. I don't really know what the difference is (& I don't really know how 
to worry about endianess)
Anyway, thanks everyone, it works ; I guess this post is now an [ANN] that 
you can import Stata, SPSS and SAS files into Julia!

On Monday, October 12, 2015 at 7:27:24 PM UTC-4, Yichao Yu wrote:
>
> On Mon, Oct 12, 2015 at 7:12 PM, Matt <[email protected] <javascript:>> 
> 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