The error message means you need to declare 'spicelib'as const.
On Dec 1, 2015 4:27 AM, "Felix" <[email protected]> wrote:

> Hi, thank you for your help. But it still doesn't work this way. Same
> error.
>
> Am Montag, 30. November 2015 20:32:15 UTC+1 schrieb Yichao Yu:
>>
>> On Mon, Nov 30, 2015 at 5:23 AM, Felix <[email protected]> wrote:
>> > Hi,
>> >
>> > I can't seem to get a hang of how to call a C function that essentially
>> > needs a string containing the path to a file as input, but it is
>> declared as
>> > a structure containing a const char. The setup is the following (SPICE
>> > library):
>> >
>> > I want to call the function:
>> >
>> > void furnsh_c ( ConstSpiceChar  * file )  { ... }
>> >
>> > with the structure ConstSpiceChar being defined as:
>> >
>> > typedef const char     ConstSpiceChar;
>> >
>> > I don't know how to call that from Julia. What I have tried and
>> modified in
>> > many ways is the following:
>> >
>> > immutable ConstSpiceChar
>> >     x::Ptr{UInt8}
>> > end
>> >
>> > kernel =
>> ConstSpiceChar(pointer("../../../../cspice/kernels/sat317.bsp"))
>>
>> This is undefined behavior, the string can be garbage collected when
>> you are still holding a pointer to it.
>>
>> >
>> > ccall((:furnsh_c , spicelib), Void, (Ptr{ConstSpiceChar},) ,
>> > pointer(kernel))
>>
>> pointer is not what you want and this is also undefined behavior even
>> if you replace pointer with the correct function that returns the
>> pointer to the object.
>>
>> What you should actually do to fix the first problem depends on the
>> actual usecase but there's an example what you can do.
>>
>> immutable JLConstSpiceChar
>>     ptr::Ptr{UInt8}
>>     str
>>     function JLConstSpiceChar(_str)
>>         str = Base.cconvert(Cstring, _str)
>>         ptr = Base.unsafe_convert(Cstring, str)
>>         # This is effectively doing what ccall does to make it GC safe to
>> pass
>>         # a string to a c function that expect a pointer.
>>         # See doc for unsafe_convert and cconvert.
>>         new(ptr, str)
>>     end
>> end
>>
>> kernel = ConstSpiceChar("../../../../cspice/kernels/sat317.bsp")
>>
>> ccall((:furnsh_c , spicelib), Void, (Ref{ConstSpiceChar},) ,kernel)
>>
>> >
>> > Which ends up in an error:
>> >
>> > LoadError: TypeError: anonymous: in ccall: first argument not a pointer
>> or
>> > valid constant expression, expected Ptr{T}, got
>> Tuple{Symbol,ASCIIString}
>> >
>> > I hope there is an easy solution to this. I am not very skilled in C.
>> >
>> > Thanks, Felix.
>> >
>> >
>>
>

Reply via email to