Джулия получает глобальную переменную в C - PullRequest
3 голосов
/ 25 февраля 2020

Я хочу получить глобальную переменную x Я только что установил Джулию из моего приложения C. Вот код, который у меня есть:

#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 вызова. Почему? Я следовал этому уроку , но он не касается поиска произвольных переменных. Исходный код показывает аналогичное использование.

enter image description here

1 Ответ

4 голосов
/ 26 февраля 2020

Я думаю, что здесь происходит несколько вещей:

Во-первых, вам нужно использовать jl_main_module, а не jl_base_module.

Во-вторых, вы не можете использовать jl_string_ptr для получения строкового значения целого числа или значения с плавающей запятой. Вы можете либо использовать x=string(sqrt(2.0)) в качестве команды для запуска, либо использовать jl_unbox_float64 в качестве функции для распаковки значения, которое вы получите от Джулии.

#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
...