2016-04-22 2 views
0

Я хотел бы translate следующую функцию C:присваивая значения `* x` через C-интерфейс Юли

static void my_C_func(int *x) { 
    *x = 100; 
    return; 
} 

в функцию Джулии. Возможно:

function my_julia_func(x::Ptr{Cint}) 
    *x = 100 
    return 
end 

В my_julia_func, линия с *x = 100 не работает, конечно. Что мне делать с этой линией?

Для получения дополнительной информации my_C_func является функцией обратного вызова в C, и я пытаюсь создать оболочку Julia для обратного вызова.

ОБНОВЛЕНИЕ Похоже, Ptr(x)=100. Я тестировал два аргумента указатель:

function my_julia_func(x::Ptr{Cint}, y::Ptr{Cint}) 
    Ptr(x) = 100 
    Ptr(y) = 200 
    println("*x = ", Ptr(x)) 
    println("*y = ", Ptr(y)) 
end 

В результате

*x = 200 
*y = 200 

Кажется странным. Если я:

function my_julia_func(x::Ptr{Cint}, y::Ptr{Cint}) 
    Ptr(x) = 100 
    println("*x = ", Ptr(x)) 
    Ptr(y) = 200 
    println("*y = ", Ptr(y)) 
end 

я получаю:

*x = 100 
*y = 200 

Как я должен сделать это правильно?

Когда я только напечатанный x и y, он показывает:

x = Ptr{Int32} @0x00007fff5d57685c 
y = Ptr{Int32} @0x00007fff5d576858 
+0

Это не действительная функция C. – Lundin

+0

@ Lundin LOL ... Вы видите, что я, конечно, не очень хорош в C ... Теперь все в порядке? – Chang

+0

Да, теперь это правильно, хотя 'return;' не требуется. – Lundin

ответ

4

Ptr(x) = 100 определяет локальную функцию, теневое глобальное определение Ptr. Это совсем не то, чего вы хотите, и поэтому определение Ptr(y) = 200 изменило значение Ptr(x). Ptr в любом случае не является указателем разыменования, поэтому это не правильная функция.

Вы хотите:

function my_julia_func!(x::Ptr{Cint}) 
    unsafe_store!(x, 100) 
    nothing 
end 

nothing служит той же цели к вашему return, но немного более идиоматических)

Аналогично, для "разыменования" x, вы хотите unsafe_load(x). Обратите внимание, что эти операции: unsafe, поэтому вы убедитесь, что знаете, что делаете перед их выполнением, или рискуете потерями сегментации или повреждением памяти. (Хотя они не более опасны, чем разыменование указателя C.)

+0

Спасибо большое !!! Я создал функции с помощью 'Ptr (x)' ... LOL – Chang

Смежные вопросы