> 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 >
Unfortunately this is a killing feature when one needs to change the very root of the structs tree. In present case I need to change fields in https://github.com/joa-quim/GMT.jl/blob/master/src/libgmt_h.jl#L1436 as well as in its descendents but I can't change the root one (GMT_TEXTSET) and I can't create one from scratch in Julia either because that struct needs to created and registered by the C library. > On Thu, Feb 26, 2015 at 2:32 PM J Luis <[email protected] <javascript:>> > 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)? >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>> >>> >>
