C структура типа соответствий в Юлии - PullRequest
0 голосов
/ 27 ноября 2018

Я пытаюсь использовать функции C в Julia со структурами в качестве аргументов, я вызываю функции, но что-то идет не так.Простым примером является следующий:

In C:

typedef struct {
    int width;
    int height;
    int stride;
    float* elements;
} Matriz;

- это простая структура, в которой хранится матрица с width, heigth, stride и elements поля

float GetElm(const Matriz A, int row, int col)
{
    return (row < A.height && col < A.width ?
        A.elements[row * A.stride + col] : 0);
}

- это функция, которая возвращает элемент матрицы с учетом строки и столбца.

в Julia:

immutable Matriz
width::Cint
height::Cint
stride::Cint
elements::Array{Float32,1}
end

M=Matriz(5,5,5,Array{Float32,1}(collect(0:24))) #creating a Matrix of 5x5


ccall((:GetElm,"path/to/dll"),Float32,(Matriz,Cint,Cint),M,0,1)

* ccall должен возвращать 1.0 в соответствии с кодом, но возвращает другое значение, я что-то не так делаю?

1 Ответ

0 голосов
/ 27 ноября 2018

Когда вы выполняете вызов функции с ccall напрямую с аргументом массива, Джулия отправляет собственный адрес Array.

с struct с, однако процесс не является автоматическим.Один из способов отправить собственный адрес массива - это использовать pointer.Вам нужно обновить struct в Julia, если вы собираетесь использовать этот метод.

struct Matriz
    width::Cint
    height::Cint
    stride::Cint
    elements::Ptr{Cfloat}
end

arr = Array{Float32,1}(collect(0:24))
M=Matriz(5,5,5, pointer(arr)) #creating a Matrix of 5x5
ccall((:GetElm,"mylib.so"),Float32,(Matriz,Cint,Cint),M,0,1)

Перед этим, пожалуйста, прочитайте руководство по pointer, так как это опасная операция из-за Юлии ГК.

...