C Интерфейс
ccallКлючевое слово
ccall((function_name, library), returntype, (argtype1, ...), argvalue1, ...) ccall(function_pointer, returntype, (argtype1, ...), argvalue1, ...)
Вызов функции в C-экспортированной динамической библиотеке, заданной кортежем (function_name, library), где каждый компонент является строкой или символом. В качестве альтернативы, ccall может также использоваться для вызова указателя на функцию function_pointer, например, возвращённого функцией dlsym.
Обратите внимание, что кортеж типа аргументов должен быть литеральным кортежем, а не переменной или выражением, имеющим тип кортеж.
Каждый argvalue к ccall будет преобразован в соответствующий argtype, путём автоматического вставки вызовов к unsafe_convert(argtype, cconvert(argtype, argvalue)). (См. также документацию для unsafe_convert и cconvert для получения дополнительных сведений.) В большинстве случаев это просто приводит к вызову convert(argtype, argvalue).
Core.Intrinsics.cglobalФункция
cglobal((symbol, library) [, type=Cvoid])
Получение указателя на глобальную переменную в C-экспортированной динамической библиотеке, заданной точно так же, как в ccall. Возвращает указатель Ptr{Type}, по умолчанию Ptr{Cvoid}, если аргумент Type не указан. Значения могут быть прочитаны или записаны с помощью unsafe_load или unsafe_store! соответственно.
Base.@cfunctionМакрос
@cfunction(callable, ReturnType, (ArgumentTypes...,)) -> Ptr{Cvoid}
@cfunction($callable, ReturnType, (ArgumentTypes...,)) -> CFunction
Генерация указателя на вызываемую из C функцию из функции Julia closure для заданной сигнатуры типа. Для передачи возвращаемого значения в ccall, используйте тип аргумента Ptr{Cvoid} в сигнатуре.
Обратите внимание, что кортеж типа аргументов должен быть литеральным кортежем, а не переменной или выражением, имеющим тип кортеж (хотя он может включать выражение splat). И что эти аргументы будут вычислены в глобальной области видимости во время компиляции (а не отложены до времени выполнения). Добавление '$' перед аргументом функции изменяет это, создавая замыкание во время выполнения над локальной переменной callable.
См. раздел руководства по использованию ccall и cfunction.
Примеры
julia> function foo(x::Int, y::Int)
return x + y
end
julia> @cfunction(foo, Int, (Int, Int))
Ptr{Cvoid} @0x000000001b82fcd0
Исходный код
Base.CFunctionТип
CFunction struct
Обработка сборки мусора для возвращаемого значения из @cfunction, когда первый аргумент аннотирован с '$'. Как и все cfunction обработчики, он должен передаваться в ccall как Ptr{Cvoid}, и будет автоматически преобразован в месте вызова в соответствующий тип.
См. @cfunction.
Base.unsafe_convertФункция
unsafe_convert(T, x)
Преобразование x в C-аргумент типа T, где входной x должен быть результатом cconvert(T, ...).
В тех случаях, когда convert потребовалось бы принять объект Julia и преобразовать его в Ptr, для этого следует использовать данную функцию для определения и выполнения преобразования.
Будьте внимательны, чтобы убедиться, что ссылка Julia на x существует до тех пор, пока результат этой функции будет использоваться. Следовательно, аргумент x этой функции никогда не должен быть выражением, только имя переменной или ссылка на поле. Например, x=a.b.c допустимо, но x=[a,b,c] нет.
Префикс unsafe этой функции указывает на то, что использование результата этой функции после того, как аргумент x к этой функции больше недоступен для программы, может привести к неопределённому поведению, включая повреждение программы или ошибки сегментации, в любое последующее время.
См. также cconvert
Base.cconvertФункция
cconvert(T,x)
Преобразование x в значение, которое будет передано в C-код как тип T, обычно путём вызова convert(T, x).
В случаях, когда x не может быть безопасно преобразован в T, в отличие от convert, cconvert может вернуть объект типа, отличного от T, который, однако, подходит для обработки unsafe_convert. Результат этой функции должен оставаться действительным (для сборки мусора) до тех пор, пока результат unsafe_convert больше не нужен. Это может быть использовано для выделения памяти, которая будет использоваться ccall. Если необходимо выделить несколько объектов, в качестве значения возврата можно использовать кортеж объектов.
Ни convert, ни cconvert не должны принимать объект Julia и преобразовывать его в Ptr.
Base.unsafe_loadФункция
unsafe_load(p::Ptr{T}, i::Integer=1)
Загрузка значения типа T из адреса i-го элемента (индексируется с 1) начиная с p. Это эквивалентно C-выражению p[i-1].
Префикс unsafe этой функции указывает на то, что проверка указателя p на его валидность не выполняется. Неправильное использование может привести к сбою вашей программы или возвращению ложных ответов, так же, как в C.
Base.unsafe_store!Функция
unsafe_store!(p::Ptr{T}, x, i::Integer=1)
Сохранение значения типа T по адресу i-го элемента (индексируется с 1) начиная с p. Это эквивалентно C-выражению p[i-1] = x.
Префикс unsafe этой функции указывает на то, что проверка указателя p на его валидность не выполняется. Неправильное использование может привести к повреждению или сбою вашей программы, так же, как в C.
Base.unsafe_copyto!Метод
unsafe_copyto!(dest::Ptr{T}, src::Ptr{T}, N)
Копирование N элементов из указателя-источника в указатель-назначение без проверок. Размер элемента определяется типом указателей.
Префикс unsafe этой функции указывает на то, что проверка указателей dest и src на их валидность не выполняется. Неправильное использование может привести к повреждению или сбою вашей программы, так же, как в C.
Base.unsafe_copyto!Метод
unsafe_copyto!(dest::Array, do, src::Array, so, N)
Копирование N элементов из массива-источника в массив-назначение, начиная с смещения so в источнике и do в назначении (индексируется с 1).
Префикс unsafe этой функции указывает на то, что проверка, чтобы N был в пределах границ массива, не выполняется. Неправильное использование может привести к повреждению или сбою вашей программы, так же, как в C.
Base.copyto!Функция
copyto!(dest, do, src, so, N)
Копирование N элементов из коллекции src, начиная со смещения so, в массив dest, начиная со смещения do. Возвращает dest.
copyto!(dest::AbstractArray, src) -> dest
Копирование всех элементов из коллекции src в массив dest, длина которого должна быть больше или равна длине n коллекции src. Первые n элементы dest перезаписываются, остальные элементы остаются без изменений.
Примеры
julia> x = [1., 0., 3., 0., 5.];
julia> y = zeros(7);
julia> copyto!(y, x);
julia> y
7-element Array{Float64,1}:
1.0
0.0
3.0
0.0
5.0
0.0
0.0
Исходный кодcopyto!(dest, Rdest::CartesianIndices, src, Rsrc::CartesianIndices) -> dest
Копирование блока src в диапазоне Rsrc в блок dest в диапазоне Rdest. Размеры двух областей должны совпадать.
Base.pointerФункция
pointer(array [, index])
Получение нативного адреса массива или строки, необязательно в заданной позиции index.
Эта функция "небезопасная". Убедитесь, что ссылка Julia на array существует до тех пор, пока этот указатель будет использоваться. Макрос GC.@preserve должен использоваться для защиты аргумента array от сборки мусора в данном блоке кода.
Обращение к Ref(array[, index]) предпочтительнее этой функции, так как оно гарантирует валидность.
Base.unsafe_wrapМетод
unsafe_wrap(Array, pointer::Ptr{T}, dims; own = false)
Оборачивает объект Julia Array вокруг данных по адресу, указанному pointer, без создания копии. Тип элемента указателя T определяет тип элемента массива. dims представляет собой либо целое число (для одномерного массива), либо кортеж из размеров массива. own необязательно указывает, должен ли Julia взять на себя владение памятью, вызвав free для указателя, когда массив больше не ссылается.
Эта функция помечена как «небезопасная», потому что она аварийно завершится, если pointer не является корректным адресом данных требуемой длины.
Base.pointer_from_objrefФункция
pointer_from_objref(x)
Получить адрес памяти объекта Julia в виде Ptr. Существование полученного Ptr не защищает объект от сборки мусора, поэтому вы должны убедиться, что объект остается сохранённым на всё время использования Ptr.
Эта функция не может вызываться для неизменяемых объектов, так как у них нет стабильных адресов памяти.
исходный код
Base.unsafe_pointer_to_objrefФункция
unsafe_pointer_to_objref(p::Ptr)
Преобразовать Ptr в ссылку на объект. Предполагается, что указатель ссылается на действительный выделенный в куче объект Julia. В противном случае поведение неопределённо, поэтому эта функция считается «небезопасной» и должна использоваться с осторожностью.
Base.disable_sigintФункция
disable_sigint(f::Function)
Отключить обработчик Ctrl-C во время выполнения функции на текущей задаче, для вызова внешнего кода, который может вызвать код julia, который не безопасен для прерываний. Предназначено для вызова с помощью синтаксиса блока do следующим образом:
disable_sigint() do
# interrupt-unsafe code
...
end
Это не требуется на потоках рабочих процессов (Threads.threadid() != 1), так как InterruptException будет доставлен только на главный поток. Внешние функции, которые не вызывают код julia или julia runtime, автоматически отключают sigint во время своего выполнения.
Base.reenable_sigintФункция
reenable_sigint(f::Function)
Возобновить обработчик Ctrl-C во время выполнения функции. Временное обращение действия disable_sigint.
Base.systemerrorФункция
systemerror(sysfunc, iftrue)
Возбуждает SystemError для errno с описательной строкой sysfunc, если iftrue равно true
Core.PtrТип
Ptr{T}
Адрес памяти, ссылающийся на данные типа T. Однако нет гарантии, что память действительна или что она фактически представляет данные указанного типа.
Core.RefТип
Ref{T}
Объект, который безопасно ссылается на данные типа T. Этот тип гарантирует указание на действительную, выделенную Julia память правильного типа. Базовые данные защищены от освобождения сборщиком мусора, пока сама ссылка Ref остается ссылаемой.
В Julia, объекты Ref де-реферируются (загружаются или сохраняются) с помощью [].
Создание Ref на значение x типа T обычно записывается как Ref(x). Кроме того, для создания внутренних указателей на контейнеры (например, Array или Ptr) можно записать Ref(a, i) для создания ссылки на i-й элемент a.
При передаче в качестве аргумента ccall (в виде типа Ptr или Ref), объект Ref будет преобразован в родной указатель на данные, на которые он ссылается.
В Julia нет недействительных (NULL) Ref, но объект C_NULL типа Ptr может быть передан в аргумент ccall Ref.
Base.CcharТип
Cchar
Эквивалентно родному типу C char.
Base.CucharТип
Cuchar
Эквивалентно родному типу C unsigned char (UInt8).
Base.CshortТип
Cshort
Эквивалентно родному типу C signed short (Int16).
Base.CstringТип
Cstring
Строка в стиле C, состоящая из символов родного типа Cchar. Строки C завершаются нулём. Для строк в стиле C, составленных из родного типа широких символов, см. Cwstring. Дополнительную информацию об обмене строками с C см. в справочнике.
Base.CushortТип
Cushort
Эквивалентно родному типу C unsigned short (UInt16).
Base.CintТип
Cint
Эквивалентно родному типу C signed int (Int32).
Base.CuintТип
Cuint
Эквивалентно родному типу C unsigned int (UInt32).
Base.ClongТип
Clong
Эквивалентно родному типу C signed long.
Base.CulongТип
Culong
Эквивалентно родному типу C unsigned long.
Base.ClonglongТип
Clonglong
Эквивалентно родному типу C signed long long (Int64).
Base.CulonglongТип
Culonglong
Эквивалентно родному типу C unsigned long long (UInt64).
Base.Cintmax_tТип
Cintmax_t
Эквивалентно родному типу C intmax_t (Int64).
Base.Cuintmax_tТип
Cuintmax_t
Эквивалентно родному типу C uintmax_t (UInt64).
Base.Csize_tТип
Csize_t
Эквивалентно встроенному типу c (size_t (UInt)).
Base.Cssize_tТип
Cssize_t
Эквивалентно встроенному типу c.
источник
Base.Cptrdiff_tТип
Cptrdiff_t
Эквивалентно встроенному типу c (Int).
Base.Cwchar_tТип
Cwchar_t
Эквивалентно встроенному типу c (Int32).
Base.CwstringТип
Cwstring
Строка в стиле C, состоящая из нативных символов типа Cwchar_t. Строки в стиле C завершаются нулем. Для строк в стиле C, составленных из нативного типа символов, см. Cstring. Дополнительную информацию об интерперации строк с C см. в руководстве.
Base.CfloatТип
Cfloat
Эквивалентно встроенному типу c (Float32).
Base.CdoubleТип
Cdouble
Эквивалентно встроенному типу c (Float64).
Интерфейс LLVM
Core.Intrinsics.llvmcallФункция
llvmcall(IR::String, ReturnType, (ArgumentType1, ...), ArgumentValue1, ...) llvmcall((declarations::String, IR::String), ReturnType, (ArgumentType1, ...), ArgumentValue1, ...)
Вызов строки LLVM IR в первом аргументе. Аналогично блоку функции LLVM, аргументы доступны как последовательные безымянные переменные SSA (%0, %1 и т.д.).
Необязательная строка объявлений содержит объявления внешних функций, необходимые для компиляции строки IR. Несколько объявлений можно передать, разделив их символами новой строки.
Обратите внимание, что кортеж типа аргумента должен быть литеральным кортежем, а не кортежем-переменной или выражением.
Каждый ArgumentValue к llvmcall будет преобразован в соответствующий ArgumentType путём автоматической вставки вызовов unsafe_convert(ArgumentType, cconvert(ArgumentType, ArgumentValue)). (См. также документацию по unsafe_convert и cconvert для получения дополнительных сведений.) В большинстве случаев это приводит к вызову convert(ArgumentType, ArgumentValue).
См. test/llvmcall.jl для примеров использования.
© 2009–2019 Jeff Bezanson, Stefan Karpinski, Viral B. Shah, and other contributors
Licensed under the MIT License.
https://docs.julialang.org/en/v1.0.4/base/c/