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
>>>>
>>>>
>