On Monday, October 12, 2015 at 6:46:51 PM UTC-4, Matt 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
>

That's incorrect.   In the original C code you quoted, those to fields were 
declared with a :1 suffix, i.e. as a bit field:

    http://www.tutorialspoint.com/cprogramming/c_bit_fields.htm

That means that in the C struct, they are stored as 1 bit each, packed 
consecutively into a small number of bytes.  How many bytes an how they are 
packed is implementation dependent.  I'm not sure if they are packed into 
one byte (UInt8) or 4 bytes (UInt32), and as the most significant or the 
least significant bits, but they are definitely not stored as two separate 
Cint fields.

Hence, you should declare them as a single field, and do some 
experimentation with your compiler to see what size that field should be 
and where the bits are in it.  And beware that the code to access those 
field may not be portable.

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

No, pointer_from_objref is definitely not what you want here.  It is only 
for working with jl_value_t* pointers via the Julia C API, which is not 
what you have here.

You could do stick v.union into an array and reinterpret it that way, i.e.

reinterpret(T, [v.union])[1]

for your desired type T.

Reply via email to