Hi Kevin,
It probably would, but in this case the C function takes a void pointer
argument and passes that to the Julia callback function. Unfortunately, I
can't change the type of the argument. I was hoping that there was a way to
convert that void pointer back to an array, but it isn't looking like that
is possible. I guess the answer is to pass a blob of text with some type of
delimiter to pass multiple values. That would be significantly slower
though.
Thanks,
-G
On Sunday, August 10, 2014 10:56:23 AM UTC-5, Kevin Squire wrote:
>
> Hi Gerry,
>
> I think I see whats going on. If the pointer that is being passed to
>> pointer_to_array is void, then you get a array of void pointers. In my case
>> the original array was an array of strings, so...
>>
>> arr = pointer_to_array(cbdata, 4, true)
>> println(bytestring(convert(Ptr{Uint8}, val[1])))
>>
>
> Was the original array of strings allocated by Julia, or in your C
> function?
>
> I think your solution is close. It would be slightly cleaner if you
> declared you function to take a Ptr{Ptr{Uint8}}:
>
> function my_callback(cbdata::Ptr{Ptr{Uint8}})
> arr = pointer_to_array(cbdata, 4) # arr of length 4
> println(bytestring(arr[1]))
> nothing
> end
>
> cbfunc = cfunction(my_callback, Void, (Ptr{Ptr{Uint8}},))
>
> Does this work?
>
> BTW, have you seen Steven Johnson's blog post on Passing Julia Callback
> Functions to C <http://julialang.org/blog/2013/05/callback/>? I've found
> it quite useful.
>
> Cheers!
> Kevin
>
>
>
>
>> Is there a better way to do this?
>>
>> Thanks,
>> -G
>>
>>
>> On Sunday, August 10, 2014 4:23:29 AM UTC-5, Gerry Weaver wrote:
>>>
>>> Hi Kevin,
>>>
>>> I found the pointer_to_array function, but I'm having some trouble
>>> figuring how to call it correctly. I assume it has something to do with the
>>> pointer being a void pointer. I've been searching for something that might
>>> give me a clue how to do this, but I haven't found anything very useful so
>>> far.
>>>
>>> Thanks,
>>> -G
>>>
>>> On Sunday, August 10, 2014 4:06:52 AM UTC-5, Kevin Squire wrote:
>>>>
>>>> Hi Gerry,
>>>>
>>>> "pointer_to_array" is probably what you're looking for. See
>>>> http://julia.readthedocs.org/en/latest/manual/calling-
>>>> c-and-fortran-code/#accessing-data-through-a-pointer for more
>>>> information.
>>>>
>>>> Cheers,
>>>> Kevin
>>>>
>>>>
>>>> On Sun, Aug 10, 2014 at 1:17 AM, Gerry Weaver <[email protected]>
>>>> wrote:
>>>>
>>>>> I forgot to mention that I'm trying to accomplish this with arrays
>>>>> right now. I can pass a Julia array to C and access it there, but I can't
>>>>> figure out how to convert it back to a Julia array from a C void pointer
>>>>> when calling back to Julia from C.
>>>>>
>>>>>
>>>>> On Sunday, August 10, 2014 1:57:18 AM UTC-5, Gerry Weaver wrote:
>>>>>>
>>>>>> Hello All,
>>>>>>
>>>>>> I have a C function called mycfunc that takes a callback function
>>>>>> pointer (cbfunc) and a void pointer (cbdata) as arguments. mycfunc calls
>>>>>> the callback function (cbfunc) passing the void pointer (cbdata) as its
>>>>>> argument. I'm trying to figure out how to pass a Julia type as the void
>>>>>> pointer argument and convert it back to the Julia type in the Julia
>>>>>> function passed as the callback function argument. I can do this with a
>>>>>> simple string, but I'm having some difficulty in figuring out how to do
>>>>>> it
>>>>>> with arrays and other types. Any advice on this would be much
>>>>>> appreciated.
>>>>>>
>>>>>>
>>>>>> typedef int (* mycallback)(void *cbdata);
>>>>>>
>>>>>> void mycfunc(mycallback cbfunc, void *cbdata)
>>>>>> {
>>>>>> cbfunc(cbdata);
>>>>>> }
>>>>>>
>>>>>> Thanks,
>>>>>> -G
>>>>>>
>>>>>>
>>>>>>
>>>>
>