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 <shamika...@gmail.com > <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 <shamika...@gmail.com> 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. >>> >> >