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