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.
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]
> <javascript:>> 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.
>>>
>>
>