right, you can't mutate it directly, but you can make a new copy with the
intended changes, then use unsafe_store to write those changes back into
the struct.

On Mon, Aug 10, 2015 at 3:56 PM J Luis <jmfl...@gmail.com> wrote:

> ... amd I am using unsafe_load()
>
>
>     S0 = unsafe_load(unsafe_load(TTABLE.segment,1),1)        #
> ::GMT.GMT_TEXTSEGMENT
> https://github.com/joa-quim/GMT.jl/blob/master/src/gmt_main.jl#L860
>
> but if I add this line after
>
>  S0.n_rows = 2
>
>     ERROR: type GMT_TEXTSEGMENT is immutable
>     in GMTJL_Text_init at C:\progs_cygw\GMTdev\GMT.jl\src\gmt_main.jl:861
>
>
>
> segunda-feira, 10 de Agosto de 2015 às 20:47:27 UTC+1, J Luis escreveu:
>>
>>
>>
>> segunda-feira, 10 de Agosto de 2015 às 20:15:57 UTC+1, Jameson escreveu:
>>>
>>> My suggestion would be to mirror only the parts of those structs that
>>> are part of the public API. Then use unsafe_load / unsafe_store to read /
>>> modify / write the intended changes. The API authors were nice to put the
>>> public fields at the top so that you can do this (many libraries don't /
>>> can't do this). Then the "real" object will always be the Ptr to the one
>>> allocated by GMT, and you only have temporary copies of them alive at any
>>> time inside Julia.
>>>
>>
>> But GMT_TEXTSEGMENT is part of the GMT API (hm, have to check why it
>> doesn't show up in http://gmt.soest.hawaii.edu/doc/latest/GMT_API.html)
>>
>> Sorry, to be concrete, and repeating myself. I need to change n_rows of
>>
>>
>> http://gmt.soest.hawaii.edu/projects/gmt/repository/entry/branches/5.2.0/src/gmt_resources.h#L517
>>
>> Can I do it?
>>
>> BTW, I'm a developer of GMT (that's why I could create that backdoor
>> function that temporarily saved me on this), although the API was all
>> created by P. Wessel.
>>
>>
>>
>>>
>>>
>>> On Mon, Aug 10, 2015 at 2:53 PM J Luis <jmf...@gmail.com> wrote:
>>>
>>>>
>>>>
>>>>> usually, there's is one big toplevel distinction driven by who will
>>>>> free the memory: if C will be freeing the memory, then you must always 
>>>>> have
>>>>> the C code also allocating the memory (hopefully the library author 
>>>>> provide
>>>>> some sort of new / alloc / create function, although sometimes they rely 
>>>>> on
>>>>> the user calling malloc).
>>>>>
>>>>
>>>> Yes, the GMT_Create_Data (that ccals a C function with the same name)
>>>> does that.
>>>>
>>>>     https://github.com/joa-quim/GMT.jl/blob/master/src/gmt_main.jl#L852
>>>>   <https://github.com/joa-quim/GMT.jl/blob/master/src/gmt_main.jl#L852>
>>>>
>>>>>
>>>>> >     Is that really impossible and I'm doomed to the path exemplified
>>>>> with that C GMT_blind_change_struct() function?
>>>>>
>>>>> ideally, C libraries that expect to manage a struct's memory also
>>>>> provide accessor methods to read any of the structs important fields so
>>>>> that you can always declare its type as Ptr{Void} in Julia. However, I
>>>>> realize this is true of many C libraries.
>>>>>
>>>>
>>>>
>>>> The pointers are ok, my real problem are those 'scalars' like the
>>>> n_rows in
>>>>
>>>>
>>>> http://gmt.soest.hawaii.edu/projects/gmt/repository/entry/branches/5.2.0/src/gmt_resources.h#L517
>>>>
>>>> I only know the number of rows after having read the data and than the
>>>> immut is already created
>>>>
>>>>
>>>>>
>>>>>
>>>>> On Mon, Aug 10, 2015 at 9:58 AM J Luis <jmf...@gmail.com> wrote:
>>>>>
>>>>>>
>>>>>>
>>>>>> segunda-feira, 10 de Agosto de 2015 às 14:15:15 UTC+1, Isaiah
>>>>>> escreveu:
>>>>>>>
>>>>>>> https://github.com/JuliaLang/julia/pull/12113
>>>>>>>
>>>>>>
>>>>>> So there is hope. Thanks
>>>>>>
>>>>>>
>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> On Mon, Aug 10, 2015 at 8:11 AM, J Luis <jmf...@gmail.com> wrote:
>>>>>>>
>>>>>>>> Hi,
>>>>>>>>
>>>>>>>> Let me try to explain my need to fight with immutables. I made
>>>>>>>> another round to my GMT wrapper (which is hopefully almost ready) and
>>>>>>>> struggled again with the immutables. The point is that GMT API structs 
>>>>>>>> are
>>>>>>>> deeply nested and need to be mirrored with immutables (otherwise Julia
>>>>>>>> crashes). Namely this one
>>>>>>>>
>>>>>>>>
>>>>>>>> https://github.com/joa-quim/GMT.jl/blob/master/src/libgmt_h.jl#L1445
>>>>>>>>
>>>>>>>> so I first went with the advised solution of creating and filling
>>>>>>>> the type is julia and replace the pointees of the immutable type, 
>>>>>>>> which I
>>>>>>>> did here (see the commented code):
>>>>>>>>
>>>>>>>>
>>>>>>>> https://github.com/joa-quim/GMT.jl/blob/master/src/gmt_main.jl#L874
>>>>>>>>
>>>>>>>> but the problem now is that *TS* is a memory owned by Julia and
>>>>>>>> that will be fatal when GMT's own memory cleaning functions try to 
>>>>>>>> free it
>>>>>>>> and  -> Julia crashes.
>>>>>>>> So if use a pure Julia solution I've no choice but to let memory
>>>>>>>> leeks and other house keeping to be done. Not good at all.
>>>>>>>>
>>>>>>>> For the time being I ended up with this ugly C  trick of sending to
>>>>>>>> C the job of changing some members (non-pointers) that need absolutely 
>>>>>>>> to
>>>>>>>> changed after the type has been created
>>>>>>>>
>>>>>>>>
>>>>>>>> http://gmt.soest.hawaii.edu/projects/gmt/repository/entry/branches/5.2.0/src/gmt_api.c#L7376
>>>>>>>>
>>>>>>>> but besides being ugly I've no guarantee that I can convince my
>>>>>>>> partners to let that backdoor go into the GMT lib. I much lovelier 
>>>>>>>> trick
>>>>>>>> would be if this chunk only of that backdoor function would work.
>>>>>>>>
>>>>>>>>     else if (!strncmp (keyword, "API_POINTER_", 12U)) {        /*
>>>>>>>> Blindly change a pointer to a scalar. Irritatingly Julia ignores this 
>>>>>>>> */
>>>>>>>>         if (!strcmp(&keyword[12], "UINT64"))
>>>>>>>>             *(uint64_t *)ptr = *(uint64_t *)what;
>>>>>>>>     }
>>>>>>>>
>>>>>>>> but the problem is that I am not able to get from Julia the
>>>>>>>> pointers address that would make that work. I tried with
>>>>>>>>
>>>>>>>>     pointer(S0.n_rows)
>>>>>>>>
>>>>>>>> and
>>>>>>>>
>>>>>>>>     pointer_from_objref(S0.n_rows)
>>>>>>>>
>>>>>>>> and others, but nothing. It seams to work in the C side (I can see
>>>>>>>> it with the debugger when I set in that piece of code) but than nothing
>>>>>>>> changes. The C struct doesn't change.
>>>>>>>> Is there a way to get the C pointer address from Julia?
>>>>>>>>
>>>>>>>> So, I guess my question is:
>>>>>>>>
>>>>>>>>     How do we do to change immutable members that are not pointers?
>>>>>>>>     Is that really impossible and I'm doomed to the path
>>>>>>>> exemplified with that C GMT_blind_change_struct() function?
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>

Reply via email to