2015-10-01 3 views
3

Я хотел бы вызвать функцию, которая вызывает функцию с, но я хочу, чтобы иметь возможность выгрузить реальную функцию CКак использовать/создать более общий ccall в Julia?

function Ccall(fn) 
    ... more code 1 ...  
    ccall((fn, libc), Int32,()) 
    ... more code 2 ... 
end 

где more code часть всегда то же самое, но fn может измениться. Для простого примера, я пытаюсь вызвать эту функцию Ccall

f = "clock" |> Symbol 
Ccall(f) 

, но я получаю сообщение об ошибке. Также попробовал

function Ccall(fn) 
    ... more code 1 ...  
    ccall(fn, Int32,()) 
    ... more code 2 ... 
end 

с

const f = ("clock" |> Symbol, "libc") 
Ccall(f) 

, но не повезло, f не является константным выражением, каким оно должно быть, просто потому, что я ставлю перед const.

Есть ли способ ccall-ing с вышеуказанной универсальностью? Если да, то как?

+1

Как насчет использования макросов для переноса этих функций c? взгляните на [это] (https://github.com/JuliaGL/ModernGL.jl/blob/master/src/glFunctions.jl). – Gnimuc

ответ

5

ccall требует выражения, а не значения --- это немного похоже на макрос в этом отношении. Вы можете сгенерировать соответствующие выражения (см. Пакет HDF5.jl для примера), но лучше всего создать одну функцию-обертку на C-функцию, как предложено Gnimuc Key.

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