Okay, no worries!
On Sun, Aug 10, 2014 at 2:38 PM, Gerry Weaver <[email protected]> wrote: > Hi Kevin, > > I had already tried something similar to what you propose, but neither > version works. Hence my confusion. println in either case just prints > garbage. It does compile though. I was hoping to be able to hide some of > this C callback complexity from the api user. It's beginning to look like > that would be difficult to do. I haven't really had the chance to think > through what a macro might provide though. In any case, I think the C > version ends up being much more straight forward. I'm going to stop > bothering you guys with this. There are many other areas in Julia to > explore ;) Thanks for your help and patience. > > Thanks, > -G > > > On Sunday, August 10, 2014 3:02:16 PM UTC-5, Kevin Squire wrote: > >> More specifically, you can at least do the following: >> >> function my_callback(_cbdata::Ptr{Void}) >> cbdata = reinterpret(Ptr{Ptr{Uint8}}, _cbdata) # equivalent to >> casting >> arr = pointer_to_array(cbdata, 4) # arr of length 4 >> println(bytestring(arr[1])) >> nothing >> end >> >> cbfunc = cfunction(my_callback, Void, (Ptr{Void},)) >> >> Although I think the previous version might work (did you try it?)--Julia >> can't tell a Ptr{Void} from a Ptr{Ptr{Uint8}} when called from C, and the C >> routine just trusts that you're passing a function which takes a void >> pointer--it also can't check the type of the Julia function. >> >> Cheers, >> Kevin >> >> >> On Sun, Aug 10, 2014 at 12:47 PM, Stefan Karpinski <[email protected] >> > wrote: >> >>> This is absolutely possible. You can take any pointer and turn it into >>> an array. The only concern is garbage collection and making sure that Julia >>> knows whether it should free the memory or not. >>> >>> On Aug 10, 2014, at 3:31 PM, Gerry Weaver <[email protected]> wrote: >>> >>> 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 >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>> >>>> >>
