C Интерфейс
ccallКлючевое слово
ccall((symbol, library) or function_pointer, ReturnType, (ArgumentType1, ...), ArgumentValue1, ...)
Вызов функции в экспортированной в C общей библиотеке, заданной кортежем (function name, library), где каждый компонент — строка или символ.
Обратите внимание, что кортеж типа аргумента должен быть литеральным кортежем, а не кортежем-переменной или выражением. В качестве альтернативы, ccall также может использоваться для вызова указателя на функцию, например, возвращённого функцией dlsym.
Каждый ArgumentValue в ccall будет преобразован в соответствующий ArgumentType, путём автоматического вставки вызовов unsafe_convert(ArgumentType, cconvert(ArgumentType, ArgumentValue)). (См. также документацию для каждой из этих функций для получения дополнительных подробностей.) В большинстве случаев это приводит к вызову convert(ArgumentType, ArgumentValue).
Core.Intrinsics.cglobalФункция
cglobal((symbol, library) [, type=Void])
Получение указателя на глобальную переменную в экспортированной в C общей библиотеке, заданной точно так же, как в ccall. Возвращает Ptr{Type}, по умолчанию Ptr{Void}, если аргумент Type не указан. Значения могут быть считываются или записываются с помощью unsafe_load или unsafe_store! соответственно.
Base.cfunctionФункция
cfunction(function::Function, ReturnType::Type, ArgumentTypes::Type)
Генерация указателя на вызываемую из C функцию из функции Julia. Анотация типа возвращаемого значения в функции обратного вызова обязательна в ситуациях, когда Julia не может автоматически определить тип возвращаемого значения.
Примеры
julia> function foo(x::Int, y::Int)
return x + y
end
julia> cfunction(foo, Int, Tuple{Int,Int})
Ptr{Void} @0x000000001b82fcd0
исходный код
Base.unsafe_convertФункция
unsafe_convert(T,x)
Преобразование x в значение типа T
В случаях, когда convert потребовалось бы принять объект Julia и преобразовать его в Ptr, для определения и выполнения этого преобразования следует использовать эту функцию.
Следует быть внимательным, чтобы убедиться, что ссылка Julia на x существует до тех пор, пока результат этой функции будет использоваться. Соответственно, аргумент x этой функции никогда не должен быть выражением, только именем переменной или ссылкой на поле. Например, x=a.b.c допустимо, но x=[a,b,c] — нет.
Префикс unsafe этой функции указывает, что использование результата этой функции после того, как аргумент x этой функции больше недоступен программе, может привести к неопределённому поведению, включая повреждение программы или сегментные ошибки в любое последующее время.
Base.cconvertФункция
cconvert(T,x)
Преобразование x в значение типа T, обычно вызывая convert(T,x)
В случаях, когда x нельзя безопасно преобразовать в T, в отличие от convert, cconvert может вернуть объект типа, отличного от T, который, тем не менее, подходит для обработки функцией unsafe_convert.
Ни 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_copy!Метод
unsafe_copy!(dest::Ptr{T}, src::Ptr{T}, N)
Копирование N элементов из исходного указателя в целевой, без проверки. Размер элемента определяется типом указателей.
Префикс unsafe этой функции указывает, что валидация указателей dest и src не выполняется, чтобы убедиться, что они действительны. Некорректное использование может привести к повреждению или сегментной ошибке вашей программы, аналогично C.
Base.unsafe_copy!Метод
unsafe_copy!(dest::Array, do, src::Array, so, N)
Копирование N элементов из исходного массива в целевой, начиная с смещения so в источнике и do в целевом (индексирование с 1).
Префикс unsafe этой функции указывает, что валидация, чтобы убедиться, что N находится в пределах границ массивов, не выполняется. Некорректное использование может привести к повреждению или сегментной ошибке вашей программы, аналогично C.
Base.copy!Метод
copy!(dest, src) -> dest
Копирование всех элементов из коллекции src в массив dest.
Base.copy!Метод
copy!(dest, do, src, so, N)
Копирование N элементов из коллекции src, начиная со смещения so, в массив dest, начиная со смещения do. Возвращает dest.
Base.pointerФункция
pointer(array [, index])
Получение родного адреса элемента массива или строки. Следует быть внимательным, чтобы убедиться, что ссылка Julia на a существует до тех пор, пока этот указатель будет использоваться. Эта функция «небезопасная», как и unsafe_convert.
Вызов 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 или 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 ссылается на них.
При передаче в качестве аргумента ccall (как тип Ptr или Ref) объект Ref будет преобразован в исходный указатель на данные, на которые он ссылается.
Нет недопустимого (NULL) Ref.
Base.CcharТип
Cchar
Эквивалентен исходному типу char c.
Base.CucharТип
Cuchar
Эквивалентен исходному типу unsigned char c (UInt8).
Base.CshortТип
Cshort
Эквивалентен исходному типу signed short c (Int16).
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.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 и т.д.).
Дополнительная строка объявлений содержит объявления внешних функций, необходимые для компиляции LLVM строки IR. Несколько объявлений могут быть переданы, разделив их символом переноса строки.
Обратите внимание, что кортеж типов аргументов должен быть литеральным кортежем, а не кортежем-значением переменной или выражения.
Каждый ArgumentValue до llvmcall будет преобразован в соответствующий ArgumentType, путем автоматического вставки вызовов unsafe_convert(ArgumentType, cconvert(ArgumentType, ArgumentValue)). (см. также документацию для каждой из этих функций для получения более подробной информации). В большинстве случаев это просто приводит к вызову convert(ArgumentType, ArgumentValue).
См. test/llvmcall.jl для примеров использования.
© 2009–2016 Jeff Bezanson, Stefan Karpinski, Viral B. Shah, and other contributors
Licensed under the MIT License.
https://docs.julialang.org/en/release-0.6/stdlib/c/