当前位置:K88软件开发文章中心编程语言非主流编程语言Julia → 文章内容

Julia 嵌入式 Julia

减小字体 增大字体 作者:佚名  来源:网上搜集  发布时间:2019-1-15 16:28:28

果你已经分配了数组你能生成一个对数据的简单包装:double *existingArray = (double*)malloc(sizeof(double)*10);jl_array_t *x = jl_ptr_to_array_1d(array_type, existingArray, 10, 0);最后一个参数是一个表明 Julia 是否应该获取数据所有权的布尔值。如果这个参数非零,GC 将在数组不再引用时在数据指针上调用 free。为了获取 x 的数据,我们可以使用 jl_array_data: double *xData = (double*)jl_array_data(x);现在我们可以填写数组: for(size_t i=0; i<jl_array_len(x); i++) xData[i] = i;现在让我们调用一个在 x 上运行操作的 Julia 函数: jl_function_t *func = jl_get_function(jl_base_module, "reverse!"); jl_call1(func, (jl_value_t*)x);通过打印数组,我们可以核实 x 的元素现在被颠倒了。访问返回的数组如果一个 Julia 函数返回一个数组,jl_eval_string 和 jl_call 的返回值能被转换成一个 jl_array_t*: jl_function_t *func = jl_get_function(jl_base_module, "reverse"); jl_array_t *y = (jl_array_t*)jl_call1(func, (jl_value_t*)x);现在 y 的内容能在使用 jl_array_data 前被获取。一如往常,当它在使用中时确保保持对数组的引用。高维数组Julia 的多维数组在内存中以列的顺序被存储。这儿是一些创建二维数组和获取属性的代码: // Create 2D array of float64 type jl_value_t *array_type = jl_apply_array_type(jl_float64_type, 2); jl_array_t *x = jl_alloc_array_2d(array_type, 10, 5); // Get array pointer double *p = (double*)jl_array_data(x); // Get number of dimensions int ndims = jl_array_ndims(x); // Get the size of the i-th dim size_t size0 = jl_array_dim(x,0); size_t size1 = jl_array_dim(x,1); // Fill array with data for(size_t i=0; i<size1; i++) for(size_t j=0; j<size0; j++) p[j + size0*i] = i + j;注意到当 Julia 数组使用 1-based 的索引,C 的 API 使用 0-based 的索引(例如在调用 jl_array_dim 时)以作为惯用的 C 代码读取。异常Julia 代码能抛出异常。比如,考虑以下: jl_eval_string("this_function_does_not_exist()");这个调用将什么都不做。但是,检查一个异常是否抛出是可能的。 if (jl_exception_occurred()) printf("%s \n", jl_typeof_str(jl_exception_occurred()));如果你用一个支持异常的语言(比如,Python,C#,C++)使用 Julia C API,用一个检查异常是否被抛出的函数包装每一个调用 libjulia 的调用是有道理的,而且它用主语言重新抛出异常。抛出 Julia 异常当写一个可调用的 Julia 函数时,验证参数和抛出异常来指出错误是必要的。一个典型的类型检查像这样: if (!jl_is_float64(val)) { jl_type_error(function_name, (jl_value_t*)jl_float64_type, val); }通常的异常能使用函数来引起: void jl_error(const char *str); void jl_errorf(const char *fmt, ...);jl_error 使用一个 C 的字符串,jl_errorf 像 printf 一样被调用: jl_errorf("argument x = %d is too large", x);在这个例子中 x 被假设为一个整型。

上一页  [1] [2] 


Julia 嵌入式 Julia