PPS: Sorry, the segfault actually is unrelated. Nevertheless, I can't
figure out the right ccall signature.
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
>>
>>