Spec-Zone.ru › Julia 1.0

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/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API