c - Julia 在 C 中检索全局变量
问题描述
我想x
从我的 C 应用程序中检索我刚刚在 Julia 中设置的全局变量。这是我到目前为止的代码:
#include <julia.h>
void SimpleExecute(char *command, char *resultVar, char* result) {
jl_eval_string(command);
jl_value_t *var = jl_get_global(jl_base_module, jl_symbol(resultVar));
const char *str = jl_string_ptr(var);
sprintf(result, "%s", str);
}
int main(int argc, char *argv[])
{
char* result = malloc(sizeof(char) * 1024);
jl_init();
//(void)jl_eval_string("println(sqrt(2.0))"); //works
(void)SimpleExecute("x=sqrt(2.0)", "x", result);
jl_atexit_hook(0);
return 0;
}
但是调试器显示var
仍然NULL
在jl_get_global
调用之后。为什么?我遵循了本教程,但它没有涉及任意变量检索。源代码显示了类似的用法。
解决方案
我认为这里发生了一些事情:
首先,您需要使用jl_main_module
而不是jl_base_module
.
其次,不能用jl_string_ptr
字符串值来获取整数或浮点值。您可以x=string(sqrt(2.0))
用作运行命令,也可以jl_unbox_float64
用作函数来取消装箱从 Julia 返回的值。
#include <julia.h>
#include <stdio.h>
void SimpleExecute(char *command, char *resultVar, const char* result) {
jl_eval_string(command);
jl_value_t *var = jl_get_global(jl_main_module, jl_symbol(resultVar));
if (var && jl_is_string(var)) {
const char * str = jl_string_ptr(var);
printf("%s\n", str);
} else {
const double val = jl_unbox_float64(var);
printf("%f\n", val);
}
}
int main(int argc, char *argv[])
{
char* result = malloc(sizeof(char) * 1024);
jl_init();
// (void)jl_eval_string("println(sqrt(2.0))"); //works
(void)SimpleExecute("x = sqrt(2.0)", "x", result);
jl_atexit_hook(0);
return 0;
}
您可以通过修改以下内容来运行它:
cc -I/Users/$USER/Applications/Julia-1.3.app/Contents/Resources/julia/include/julia/ -Wl,-rpath,/Users/$USER/Applications/Julia-1.3.app/Contents/Resources/julia/lib/ -L/Users/$USER/Applications/Julia-1.3.app/Contents/Resources/julia/lib/ -ljulia main.c -o main
推荐阅读
- r - 将变量与其中许多数据包含在R中的行中的变量连接起来
- java - 以编程方式停止 Wildfly 时“WFLYJMX0012:参数和描述的长度不同”
- apache-spark - spark与neo4j中的标签传播算法
- javascript - Youtube Api 上传请求被 Cors 阻止
- javascript - “catch”子句(JavaScript/TypeScript)的“error”参数中可以包含哪种数据类型?
- coordinates - Halcon - 姿势翻转坐标系
- leaflet - Mapfish & Geoserver & 传单
- logic - 在 Coq 中如何使 `simpl` 命令只执行一步缩减?
- go - 有没有办法避免编写子模块名称
- scripting - 如何使用 Userlabel 标记电子邮件(不是完整的主题)