Thank you for your suggestions.
I haven't tried Cxx.jl, since that apparently requires some effort 
installing a new LLVM, which makes it harder to convince others to use the 
bindings.
Your second suggestion is unfortunately going in the wrong direction, 
taking a Julia array and passing it to C. It may be obvious to everybody 
else, but if the C code returns a Ptr{Ptr{Uint8}}, how can I convert this 
to an Array{String} on the Julia side?
I read the manual back and forth, and I understand how to convert a 
Ptr{Uint8} to a String, using bytestring, but the extension to an Array 
eludes me.




On Sunday, June 14, 2015 at 9:42:46 PM UTC+9, Yichao Yu wrote:
>
>
>
> On Sun, Jun 14, 2015 at 2:04 AM, Jan Strube <[email protected] 
> <javascript:>> wrote:
>
>> PPS: Sorry, the segfault actually is unrelated. Nevertheless, I can't 
>> figure out the right ccall signature.
>>
>
> If you are on a new enough version, you can probably try Cxx.jl[1]
> Otherwise, you probably need to do the conversion yourself. Have you tried 
> `Ptr{Ptr{Cchar}}`?[1]
>
> [1] https://github.com/Keno/Cxx.jl
> [2] 
> http://julia.readthedocs.org/en/latest/manual/calling-c-and-fortran-code/?highlight=char**
>  
>
>>
>>
>> On Sunday, June 14, 2015 at 2:56:34 PM UTC+9, Jan Strube wrote:
>>>
>>> PS: My current attempt to return a char** from the vector<string> looks 
>>> like this:
>>> I'm converting to a vector<const char*>, then returning the address of 
>>> the first element.
>>>
>>> const char* convert(const std::string& s)
>>> {
>>>     return s.c_str();
>>> }
>>>
>>> const char** lcevtgetcollectionnames( void* event ){
>>>   LCEventImpl* evt = static_cast<LCEventImpl*>(event);
>>>   const std::vector<std::string>* nameVec = evt->getCollectionNames();
>>>   std::vector<const char*>* names = new std::vector<const char*>;
>>>   std::transform(nameVec->begin(), nameVec->end(), 
>>> std::back_inserter(*names), convert);
>>>   return &(*names)[0];
>>> }
>>>
>>>
>>> On the Julia side I'm trying this signature:
>>> ccall((:lcevtgetcollectionnames, "test.dylib"), Ptr{Cstring}, 
>>> (Ptr{Void},), event)
>>>
>>> But this results in a seg fault 
>>>
>>> signal (11): Segmentation fault: 11
>>>
>>> lcevtgetcollectionnames at /Users/stru821/Workdir/Julia/test.dylib 
>>> (unknown line)
>>>
>>> anonymous at no file:7
>>>
>>> jl_apply at 
>>> /Users/vagrant/buildbot/slave/package_osx10_9/build/src/./julia.h:1299
>>>
>>> jl_parse_eval_all at 
>>> /Users/vagrant/buildbot/slave/package_osx10_9/build/src/toplevel.c:573
>>>
>>> jl_load at 
>>> /Users/vagrant/buildbot/slave/package_osx10_9/build/src/toplevel.c:616
>>>
>>> include at 
>>> /Applications/Julia-0.4.0-dev-539c818c4e.app/Contents/Resources/julia/lib/julia/sys.dylib
>>>  
>>> (unknown line)
>>>
>>> jl_apply at 
>>> /Users/vagrant/buildbot/slave/package_osx10_9/build/src/./julia.h:1299
>>>
>>> include_from_node1 at loading.jl:133
>>>
>>> jl_apply at 
>>> /Users/vagrant/buildbot/slave/package_osx10_9/build/src/gf.c:1632
>>>
>>> process_options at 
>>> /Applications/Julia-0.4.0-dev-539c818c4e.app/Contents/Resources/julia/lib/julia/sys.dylib
>>>  
>>> (unknown line)
>>>
>>> _start at 
>>> /Applications/Julia-0.4.0-dev-539c818c4e.app/Contents/Resources/julia/lib/julia/sys.dylib
>>>  
>>> (unknown line)
>>>
>>> jlcall__start_18703 at 
>>> /Applications/Julia-0.4.0-dev-539c818c4e.app/Contents/Resources/julia/lib/julia/sys.dylib
>>>  
>>> (unknown line)
>>>
>>> jl_apply at 
>>> /Users/vagrant/buildbot/slave/package_osx10_9/build/src/./julia.h:1299
>>>
>>> true_main at 
>>> /Applications/Julia-0.4.0-dev-539c818c4e.app/Contents/Resources/julia/bin/julia
>>>  
>>> (unknown line)
>>>
>>> main at 
>>> /Applications/Julia-0.4.0-dev-539c818c4e.app/Contents/Resources/julia/bin/julia
>>>  
>>> (unknown line)
>>>
>>> Segmentation fault: 11
>>>
>>>
>>>
>>>
>>> On Sunday, June 14, 2015 at 2:43:24 PM UTC+9, Jan Strube wrote:
>>>>
>>>> Hi,
>>>>
>>>> I'm trying to wrap the LCIO file format http://lcio.desy.de/ in Julia.
>>>> I have a proof of principle working and am starting to add more of the 
>>>> API.
>>>>
>>>> What totally stumps me is this signature:
>>>> virtual const std::vector< std::string > * 
>>>> getCollectionNames 
>>>> <http://lcio.desy.de/v02-04-03/doc/doxygen_api/html/classEVENT_1_1LCEvent.html#a9128a3f65b8a94629c0cf5e77c0194ac>
>>>>  () 
>>>> const =0
>>>>
>>>> http://lcio.desy.de/v02-04-03/doc/doxygen_api/html/classEVENT_1_1LCEvent.html#a9128a3f65b8a94629c0cf5e77c0194ac
>>>>
>>>> I've created a C library to call from Julia, so I'm happy to convert 
>>>> the return type to char**, but I just cannot figure out how to write a 
>>>> ccall that doesn't segfault.
>>>> I've seen various examples how to convert a Julia array of strings to a 
>>>> char**, but couldn't find anything that converts a char** to Julia types.
>>>>
>>>> Any help is greatly appreciated.
>>>>
>>>> Jan
>>>>
>>>>
>

Reply via email to