On Sat, Jan 9, 2016 at 4:45 AM, Shamika <[email protected]> wrote:
> I'm using jl_call for more than one input/output argument. The code is
>
> int main(int argc, char *argv[])
> {
> /* required: setup the julia context */
>
> jl_init_with_image("/usr/lib/x86_64-linux-gnu/julia","sys.so");
>
> /* run julia commands */
> jl_value_t** args;
> jl_value_t** ret;
> jl_array_t* yDataTemp;
> double* yData = NULL;
> int32_t nargs=2;
>
> jl_value_t* arg1 = (jl_box_float64(2));
> jl_value_t* arg2 = (jl_box_float64(3));
> args[0]=arg1;
> args[1]=arg2;
>
> jl_function_t *func = jl_get_function(jl_base_module, "rand");
>
> ret = (jl_value_t**) jl_call(func,args,nargs);
> // yDataTemp = (jl_array_t*) ret[0];
> // yData=(double*)jl_array_data (yDataTemp);
>
> /* strongly recommended: notify julia that the
> program is about to terminate. this allows
> julia time to cleanup pending write requests
> and run all finalizers
> */
> jl_atexit_hook(0);
> return 0;
> }
>
> I'm trying to call rand(2,3). Once this works I want to use this code for
> more than one output argument. At the moment, I get the error-
>
> fatal: error thrown and no exception handler available.
> ReadOnlyMemoryError()
> rec_backtrace at /usr/lib/x86_64-linux-gnu/julia/libjulia.so (unknown line)
> jl_throw at /usr/lib/x86_64-linux-gnu/julia/libjulia.so (unknown line)
> unknown function (ip: 0x7fc415c0ff19)
> unknown function (ip: 0x7fc41542fd40)
> unknown function (ip: 0x400992)
> __libc_start_main at /lib/x86_64-linux-gnu/libc.so.6 (unknown line)
> unknown function (ip: 0x400829)
> unknown function (ip: (nil))
>
> 1. What am I doing wrong?
> 2. If there is more than one output argument, is the following code correct?
> I'm using ret[index value] to access the output.
There's always only one return value ("output argument"), when you
write `return (a, b)`, it returns a tuple.
A tuple is just a anonymous struct and you can access like any other types.
If you know it is a Tuple{Array,Float64}, just cast the pointer to a
`struct {jl_array_t *ary; double data};` and access the field.
If you are not so sure about the return types, check the type and/or
use `jl_get_field` etc.
> yDataTemp = (jl_array_t*) ret[0];
> yData=(double*)jl_array_data (yDataTemp);
>
> Shamika
>
> On Thursday, January 7, 2016 at 8:06:24 PM UTC+5:30, Isaiah wrote:
>>>
>>> Can the output, jl_value_t* ret, point to more than one output argument?
>>
>>
>> Only as a tuple or array,
>>
>> On Thu, Jan 7, 2016 at 12:26 AM, Shamika <[email protected]> wrote:
>>>
>>> Can the output, jl_value_t* ret, point to more than one output argument?
>>>
>>> On Wednesday, January 6, 2016 at 7:45:33 PM UTC+5:30, Stefan Karpinski
>>> wrote:
>>>>
>>>> On Wed, Jan 6, 2016 at 12:15 AM, Shamika <[email protected]> wrote:
>>>>>
>>>>>
>>>>> I'm using Julia in c++ code. I have a few doubts regarding the jl_call
>>>>> function.The code is
>>>>>
>>>>> jl_array_t *ret = (jl_array_t*)jl_call(func,args,nargs);
>>>>>
>>>>> 1. Can args contain both scalar/array values?
>>>>
>>>>
>>>> Yes, both scalar and array values are represented on the C side as
>>>> jl_value_t*. Args will be a pointer to an array of jl_value_t* values –
>>>> i.e.
>>>> an array of pointers (of length nargs). Some of those pointers can point to
>>>> scalar values on the heap, some can point to array values. These can be
>>>> distinguished by their type tags, which there are various macros to access.
>>>>
>>>>>
>>>>> Does it use zero based or one based indexing?
>>>>
>>>>
>>>> Zero-based: everything on the C side is zero-based.
>>>>
>>>>>
>>>>> 2. Is there any data type that can hold both scalar/array output that
>>>>> is returned by jl_call? Right now, I have to define the output as
>>>>> jl_value_t
>>>>> or jl_array_t. Is there something more generic?
>>>>
>>>>
>>>> As I explained above, jl_value_t* is strictly more generic than
>>>> jl_array_t*. You can think of these as corresponding to Any and Array in
>>>> Julia – Array is a subtype of Any.
>>
>>
>