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 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. Размеры двух областей должны совпадать.
copyto!(dest::AbstractMatrix, src::UniformScaling)
Копирует UniformScaling в матрицу.
В Julia 1.0 этот метод поддерживал только квадратную целевую матрицу. В Julia 1.1. была добавлена поддержка прямоугольной матрицы.
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 будет использоваться.
Эта функция не может быть вызвана для неизменяемых объектов, так как у них нет стабильных адресов памяти.
источник
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-среду, автоматически отключают обработчик 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). Кроме того, для создания внутренних указателей на контейнеры (такие как массив или указатель) это можно записать как 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 заканчиваются нулём. Для строк в стиле C, составленных из нативного типа символов, см. Cstring. Дополнительную информацию об обмене строками с C см. в справочнике.
Base.CfloatТип
Cfloat
Эквивалентен встроенному типу float c (Float32).
Base.CdoubleТип
Cdouble
Эквивалентен встроенному типу double 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 и т. д.).
Необязательная строка объявлений содержит объявления внешних функций, необходимые для компиляции строки IR в llvm. Несколько объявлений могут передаваться, разделяя их символами новой строки.
Обратите внимание, что кортеж типов аргументов должен быть литеральным кортежем, а не кортежем-значением переменной или выражения.
Каждый 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.1.1/base/c/