Правильный способ вызова функции C от Джулии с помощью вызова по ссылке? - PullRequest
0 голосов
/ 10 февраля 2019

Как правильно вызвать функцию C из Julia с помощью вызова по ссылке?

Я пытаюсь вызвать функцию C из ccall из Julia, которая получает свои выходные данные в виде указателей.

Итак, функция C должна сделать что-то вроде этого:

    void plusOne(int* i){
        printf("C: i = %i\n", i[0]);
        i[0] = i[0]+1;
        printf("C: i = %i\n", i[0]);
    }

Скомпилировать ее с gcc -shared -fPIC plusOne.c -o plusOne.dll (или .so в Linux) и запустить в Julia:

    julia> i = Int32(42)
    42
    julia> ccall((:plusOne, "plusOne.dll"), Cvoid, (Ref{Cint},),i)
    C: i = 42
    C: i = 43
    julia> println("Julia: i = $i")
    Julia: i = 42

Как правильно использовать такие функции Си от Юлии?В документации Julia есть примеры для ccall (https://docs.julialang.org/en/v1/manual/calling-c-and-fortran-code/index.html),, но всегда с массивами в качестве возвращаемых данных.

Конечно, я мог бы также объявить свой i как массив размера 1. Тогда все будетработает как положено.

1 Ответ

0 голосов
/ 12 февраля 2019

Int32(42) не является ссылочным типом в Julia, и поэтому вы не можете обновить значение в функции C.

Если вам нужно изменить значение Julia, вам нужно изменить или обернуть его вссылочный тип.Вы можете использовать Array, как вы уже знаете, но более обычным способом было бы обернуть его в Ref.Итак, попробуйте инициализировать i с Ref(Int32(42)).Вы можете разыменовать значение с помощью i[].

...