You need to make new versions of both immutable objects, recursively
constructing the updated struct, then unsafe_store it back to the original
C location
On Thu, Feb 26, 2015 at 2:32 PM J Luis <[email protected]> wrote:

>
> Yes you warned me that it may sometimes segv, but what else can I do to
>>> get the pointer to a variable (a scalar or a composite type)?
>>> I asked it once in https://groups.google.com/forum/?fromgroups=#!topic/
>>> julia-users/i8DO3pBAHPU and my safe was to box it in pointer([M]). What
>>> else should I have done?
>>>
>> You can’t get a pointer to it, because an immutable doesn’t have a memory
>> location associated with it. What you can do is create a new immutable with
>> the values from the old immutable, plus any modifications you wanted to
>> make.
>>
> OK, I think I had understood that but I'm not finding a way to do it in my
> case. The point is what I need to replace is not the content of something
> pointed by a pointer. Instead it's (for example) the contents of the member
> 'rgb_low' which in itself is another immutable
>
> https://github.com/joa-quim/GMT.jl/blob/master/src/libgmt_h.jl#L1486
>
> no problems is creating a new 'Array_4_Cdouble' but how do I put in
> rgb_low, that is an immutable and for which I have no pointer? (that's
> why I was chasing the pointers of the member's type)
>
> Thanks
>
>
>>
>>> To send in a pointer to an integer to C that wants for example
>>>
>>> function blabla(int *n) {}
>>>
>>> what I do is
>>>
>>> n = [0]
>>> (wrapper to blabla) blabla(pointer(n))
>>> n = unsafe_ref(n)
>>>
>>> How should I proceed here instead of using pointer([n])?
>>>
>> This usage is fine. You are calling pointer(n) here (not pointer([n])),
>> and you keep the variable n around until all uses of it are finished
>> (inside of blabla).
>>
>>
>>> The link you send me https://github.com/JuliaLang/
>>> julia/blob/jn/ccall3/doc/manual/calling-c-and-fortran-
>>> code.rst#passing-pointers-for-modifying-inputs
>>>
>>> gives as example "width = Ref{Cint}(0)" but that errors
>>>
>>> julia> width = Ref{Cint}(0)
>>> ERROR: UndefVarError: Ref not defined
>>>
>>> This will only work on Julia 0.4 after that pull-request is merged. On
>> 0.3, you can use an Array{Cint,0} to achieve a similar effect.
>>
>> I'm more than happy to follow your advice but I need an alternative.
>>>
>>> Thanks
>>>
>>> Joaquim
>>>
>>>
>>>>
>>>>
>>>> On Tue, Feb 24, 2015 at 11:36 AM J Luis <[email protected]> wrote:
>>>>
>>>>>
>>>>>
>>>>> use unsafe_load() to convert the value to a julia object, then
>>>>>> unsafe_store() to write the new struct back.
>>>>>>
>>>>>> at some point, I want to modify unsafe_load/unsafe_store to take a
>>>>>> fieldname symbol as the second argument to make this functionality more
>>>>>> direct available. however, there hasn't seemed to be a request / issue 
>>>>>> open
>>>>>> for it yet.
>>>>>>
>>>>>
>>>>> PLEASE, do.
>>>>>
>>>>> I have the same type of problem but I'm not able to solve it with the
>>>>> solutions proposed in this thread.
>>>>> See, I have this and want to change the *rgb_low*
>>>>>
>>>>> julia> gmt_lut = unsafe_load(C.range, 1);
>>>>>
>>>>> julia> gmt_lut.rgb_low
>>>>> GMT.Array_4_Cdouble(0.583333333333333,0.0,1.0,0.0)
>>>>>
>>>>> which is a
>>>>>
>>>>> immutable Array_4_Cdouble
>>>>>     d1::Cdouble
>>>>>     d2::Cdouble
>>>>>     d3::Cdouble
>>>>>     d4::Cdouble
>>>>> end
>>>>>
>>>>> so I do
>>>>>
>>>>> julia> z = GMT.Array_4_Cdouble(0.0, 0.0, 0.0, 0.0)
>>>>> GMT.Array_4_Cdouble(0.0,0.0,0.0,0.0)
>>>>>
>>>>> julia> unsafe_store!(pointer([gmt_lut.rgb_low]), z)
>>>>> Ptr{GMT.Array_4_Cdouble} @0x00000000819faf60
>>>>>
>>>>> no errors but I don't know where new *z* immutable landed on because
>>>>> I keep seeing the old value
>>>>>
>>>>> julia> gmt_lut.rgb_low
>>>>> GMT.Array_4_Cdouble(0.583333333333333,0.0,1.0,0.0)
>>>>>
>>>>> I suspect part of it is dues to the pointer([gmt_lut.rgb_low]) command
>>>>> because when I do several of those on line I keep getting different
>>>>> addresses
>>>>>
>>>>> julia> pointer([gmt_lut.rgb_low])
>>>>> Ptr{GMT.Array_4_Cdouble} @0x0000000082b7baf0
>>>>>
>>>>> julia> pointer([gmt_lut.rgb_low])
>>>>> Ptr{GMT.Array_4_Cdouble} @0x0000000082ba00d0
>>>>>
>>>>> julia> pointer([gmt_lut.rgb_low])
>>>>> Ptr{GMT.Array_4_Cdouble} @0x0000000082ba0670
>>>>>
>>>>> but than how can modify this field(s)?
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>  ​
>>
>

Reply via email to