You appear to be returning pointers to memory that are outliving the life
of their owning object. The array "out" appears to point to memory owned by
R (which you seem to be explicitly invalidating at the end of the loop) and
you use the result of pointer([ ]), without holding a reference to [ ] in a
local variable.
On Tue, Feb 17, 2015 at 11:28 AM J Luis <[email protected]> wrote:
> Hi,
>
> When I run the function bellow I have this totally unexpected (to me at
> least) variable corruption effect
>
> X[item].direction = 0
> out = Float32[1.0f0]
> X[item].direction = 1
> out = Float32[5.0f0,5.0f0,5.0f0,5.0f0,5.0f0,5.0f0]
> X[item].direction = 0
> out = Float32[-1.9983972f18,-1.9983972f18,-1.9983972f18,-1.9983972f18,-
> 1.9983972f18,-1.9983972f18]
>
> The loop runs 3 times and the second iteration holds the correct value.
> But than, in the 3rd iteration something corrupts the the 'out' variable
> (the code doesn't touch it) and I'm thus unable to return its correct value.
> What am I doing wrong, or is there a bug?
>
> function GMTJL_post_process(API::Ptr{Void}, X, n_items::Int)
> out = [1.f0]
> for (item = 1:n_items)
> if (X[item]._type == GMT_IS_GRID) # We read or wrote a
> GMT grid, examine further
> #
> if ((R = GMT_Retrieve_Data(API, X[item].ID)) == C_NULL)
> error("GMTJL_PARSER:Error retrieving grid from GMT\n")
> end
> convert(Ptr{GMT_GRID}, R)
> elseif (X[item]._type == GMT_IS_DATASET)
> @show(X[item].direction)
> if (X[item].direction == GMT_OUT) # Here, GMT_OUT means
> "Return this info to Julia"
> if ((R = GMT_Retrieve_Data(API, X[item].ID)) == C_NULL)
> error("GMTJL_PARSER: Error retrieving matrix from GMT"
> )
> end
> Rb = unsafe_load(convert(Ptr{GMT_MATRIX}, R))
>
> if (Rb.shape == GMT_IS_COL_FORMAT) # Easy, just copy
> #memcpy (d, M->data.f8, M->n_rows * M->n_columns *
> sizeof (double));
> else # Must transpose
> out = pointer_to_array(convert(Ptr{Cfloat},Rb.data),
> Rb.n_rows * Rb.n_columns)
> end
> else
> R = X[item].obj;
> end
> @show(out)
> # Else we were passing Julia data into GMT as data input and
> we are now done with it.
> # We always destroy R at this point, whether input or
> output. The alloc_mode
> # will prevent accidential freeing of any
> externally-allocated arrays.
>
> if (GMT_Destroy_Data(API, pointer([R])) != GMT_NOERROR)
> error("GMTJL_post_process: Failed to destroy matrix R
> used in the interface bewteen GMT and Julia")
> end
> end
> end
>
> return out
>
> end
>
>
>