C Интерфейс
ccallКлючевое слово
ccall((function_name, library), returntype, (argtype1, ...), argvalue1, ...) ccall(function_name, returntype, (argtype1, ...), argvalue1, ...) ccall(function_pointer, returntype, (argtype1, ...), argvalue1, ...)
Вызов функции в C-экспортированной библиотеке динамической компоновки, указанной кортежем (function_name, library), где каждый компонент — это строка или символ. Вместо указания библиотеки можно также использовать символ или строку function_name, которые разрешаются в текущем процессе. В качестве альтернативы, 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 callable для заданной подписи типа. Чтобы передать возвращаемое значение в 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 этой функции больше не доступен программе, может привести к неопределенному поведению, включая повреждение программы или ошибки segfaults, в любой момент в будущем.
См. также 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 , чтобы убедиться, что он действителен. Неправильное использование может привести к ошибке segfault или возвращению мусорных значений, так же как и на C.
Base.unsafe_store!Функция
unsafe_store!(p::Ptr{T}, x, i::Integer=1)
Сохранение значения типа T по адресу i-го элемента (индексированного с 1), начиная с p. Это эквивалентно C-выражению p[i-1] = x.
Префикс unsafe этой функции указывает, что никакая проверка не выполняется для указателя p , чтобы убедиться, что он действителен. Неправильное использование может привести к повреждению или ошибке segfault программы, так же как и на C.
Base.unsafe_copyto!Метод
unsafe_copyto!(dest::Ptr{T}, src::Ptr{T}, N)
Копирование N элементов из указателя-источника в указатель-приемник без проверок. Размер элемента определяется типом указателей.
Префикс unsafe этой функции указывает, что никакая проверка не выполняется для указателей dest и src , чтобы убедиться, что они действительны. Неправильное использование может привести к повреждению или ошибке segfault программы, так же как и на C.
Base.unsafe_copyto!Метод
unsafe_copyto!(dest::Array, do, src::Array, so, N)
Копирование N элементов из массива-источника в массив-приемник, начиная со смещения so в источнике и do в приемнике (индексировано с 1).
Префикс unsafe этой функции указывает, что никакая проверка не выполняется для проверки, что N находится в пределах массива. Неправильное использование может привести к повреждению или ошибке segfault программы, так же как и на C.
Base.copyto!Функция
copyto!(dest::AbstractMatrix, src::UniformScaling)
Копирует UniformScaling в матрицу.
В Julia 1.0 этот метод поддерживал только квадратную целевую матрицу. В Julia 1.1. добавлена поддержка прямоугольной матрицы.
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 существует до тех пор, пока используется этот указатель. Для защиты аргумента array от сборки мусора в заданном блоке кода необходимо использовать макрос GC.@preserve.
В общем случае предпочтительнее вызывать 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.
Эта функция не может быть вызвана для неизменяемых объектов, так как у них нет стабильных адресов памяти.
См. также: unsafe_pointer_to_objref.
Base.unsafe_pointer_to_objrefФункция
unsafe_pointer_to_objref(p::Ptr)
Преобразовать Ptr в ссылку на объект. Предполагается, что указатель ссылается на корректный объект Julia, выделенный в куче. В противном случае поведение будет неопределённым, поэтому эта функция считается "небезопасной" и должна использоваться с осторожностью.
См. также: pointer_from_objref.
Base.disable_sigintФункция
disable_sigint(f::Function)
Отключить обработчик Ctrl-C во время выполнения функции на текущей задаче для вызова внешнего кода, который может вызвать код Julia, не поддерживающий прерывания. Предполагается вызов в синтаксисе блока do следующим образом:
disable_sigint() do
# interrupt-unsafe code
...
end
Это не требуется для рабочих потоков (Threads.threadid() != 1), так как InterruptException будет доставлен только в главный поток. Внешние функции, которые не вызывают код Julia или runtime Julia, автоматически отключают 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
Эквивалент родному типу char c.
Base.CucharТип
Cuchar
Эквивалент родному типу unsigned char c (UInt8).
Base.CshortТип
Cshort
Эквивалент родному типу signed short c (Int16).
Base.CstringТип
Cstring
Строка в стиле C, составленная из символов родного типа Cchar. Строки в стиле C завершаются нулём. Для строк в стиле C, составленных из родного типа символов с широким диапазоном, см. Cwstring. Дополнительная информация о совместимости строк с C — в руководстве.
Base.CushortТип
Cushort
Эквивалент родному типу unsigned short c (UInt16).
Base.CintТип
Cint
Эквивалент родному типу signed int c (Int32).
Base.CuintТип
Cuint
Эквивалент родному типу unsigned int c (UInt32).
Base.ClongТип
Clong
Эквивалент родному типу signed long c.
Base.CulongТип
Culong
Эквивалент родному типу unsigned long c.
Base.ClonglongТип
Clonglong
Эквивалент родному типу signed long long c (Int64).
Base.CulonglongТип
Culonglong
Эквивалентно встроенному unsigned long long типу c (UInt64).
Base.Cintmax_tТип
Cintmax_t
Эквивалентно встроенному intmax_t типу c (Int64).
Base.Cuintmax_tТип
Cuintmax_t
Эквивалентно встроенному uintmax_t типу c (UInt64).
Base.Csize_tТип
Csize_t
Эквивалентно встроенному size_t типу c (UInt).
Base.Cssize_tТип
Cssize_t
Эквивалентно встроенному ssize_t типу c.
Base.Cptrdiff_tТип
Cptrdiff_t
Эквивалентно встроенному ptrdiff_t типу c (Int).
Base.Cwchar_tТип
Cwchar_t
Эквивалентно встроенному wchar_t типу c (Int32).
Base.CwstringТип
Cwstring
Строка в стиле C, составленная из нативных символов типа Cwchar_t. Cwstring строки завершаются символом NUL. Для строк в стиле C, составленных из нативного типа символов, см. Cstring. Более подробную информацию о взаимодействии строк с C см. в справочном руководстве.
Base.CfloatТип
Cfloat
Эквивалентно встроенному float типу c (Float32).
Base.CdoubleТип
Cdouble
Эквивалентно встроенному float типу c (Float64).
Интерфейс LLVM
Core.Intrinsics.llvmcallФункция
llvmcall(IR::String, ReturnType, (ArgumentType1, ...), ArgumentValue1, ...) llvmcall((declarations::String, IR::String), ReturnType, (ArgumentType1, ...), ArgumentValue1, ...)
Вызов строки LLVM IR в первом аргументе. Аналогично блоку LLVM функции define, аргументы доступны как последовательные безымянные переменные SSA (%0, %1 и т.д.).
Необязательная строка объявлений содержит объявления внешних функций, необходимые для компиляции LLVM строки 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.2.0/base/c/