Spec-Zone.ru › Julia 1.4

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 чтобы убедиться, что он корректен. Неправильное использование может привести к аварийному завершению вашей программы или возвращению мусорных ответов, так же как и в 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. Размеры двух областей должны совпадать.

исходный код
END_OF_DOCUMENT_MARKER
copyto!(dest::AbstractMatrix, src::UniformScaling)

Копирует UniformScaling в матрицу.

В Julia 1.0 этот метод поддерживал только квадратную матрицу-приёмник. В Julia 1.1 была добавлена поддержка прямоугольной матрицы.

исходный код

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.

Эта функция не может быть вызвана для неизменяемых объектов, так как у них нет стабильных адресов памяти.

См. также: 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[, errno::Cint=Libc.errno()])
systemerror(sysfunc, iftrue::Bool)

Вызывает SystemError для errno с описательной строкой sysfunc если iftrue является true

исходный код

Base.windowserrorФункция

windowserror(sysfunc[, code::UInt32=Libc.GetLastError()])
windowserror(sysfunc, iftrue::Bool)

Как systemerror, но для функций API Windows, которые используют GetLastError для возврата кода ошибки вместо установки errno.

исходный код

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.

Использование в распараллеливании

Распараллеливание с объектом Ref(x) рассматривает x как скаляр:

julia> isa.(Ref([1,2,3]), [Array, Dict, Int])
3-element BitArray{1}:
 1
 0
 0
исходный код

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. Такие строки завершаются нулем. Для строк в стиле 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 и т. д.).

Необязательная строка деклараций содержит объявления внешних функций, необходимые для компиляции LLVM-IR-строки. Несколько объявлений могут передаваться, разделяя их символами новой строки.

Обратите внимание, что кортеж типов аргументов должен быть литеральным кортежем, а не переменной или выражением с типом кортежа.

Каждый ArgumentValue до llvmcall будет преобразован в соответствующий ArgumentType, путём автоматической вставки вызовов unsafe_convert(ArgumentType, cconvert(ArgumentType, ArgumentValue)). (См. также документацию по unsafe_convert и cconvert для получения дополнительных деталей.) В большинстве случаев это просто приводит к вызову convert(ArgumentType, ArgumentValue).

См. test/llvmcall.jl для примеров использования.

исходный код

© 2009–2020 Jeff Bezanson, Stefan Karpinski, Viral B. Shah, and other contributors
Licensed under the MIT License.
https://docs.julialang.org/en/v1.4.2/base/c/

Spec-Zone.ru

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