Spec-Zone.ru › Julia 1.5

C Интерфейс

Base.@ccallМакрос

@ccall library.function_name(argvalue1::argtype1, ...)::returntype
@ccall function_name(argvalue1::argtype1, ...)::returntype
@ccall $function_pointer(argvalue1::argtype1, ...)::returntype

Вызов функции в C-экспортированной динамической библиотеке, заданной library.function_name, где library — строковая константа или литерал. Библиотека может быть опущена, в этом случае function_name разрешается в текущем процессе. В качестве альтернативы, @ccall также может использоваться для вызова указателя на функцию $function_pointer, например, возвращённого dlsym.

Каждый argvalue до @ccall преобразуется в соответствующий argtype, посредством автоматической вставки вызовов unsafe_convert(argtype, cconvert(argtype, argvalue)). (См. также документацию для unsafe_convert и cconvert для более подробной информации.) В большинстве случаев это просто приводит к вызову convert(argtype, argvalue).

Примеры

@ccall strlen(s::Cstring)::Csize_t

Это вызывает функцию стандартной C-библиотеки:

size_t strlen(char *)

с использованием переменной Julia с именем s. См. также ccall.

Поддержка аргументов с переменным числом параметров осуществляется с использованием следующей конвенции:

@ccall printf("%s = %d"::Cstring ; "foo"::Cstring, foo::Cint)::Cint

Точка с запятой используется для разделения обязательных аргументов (которых должно быть как минимум один) от аргументов с переменным числом параметров.

Пример использования внешней библиотеки:

# C signature of g_uri_escape_string:
# char *g_uri_escape_string(const char *unescaped, const char *reserved_chars_allowed, gboolean allow_utf8);

const glib = "libglib-2.0"
@ccall glib.g_uri_escape_string(my_uri::Cstring, ":/"::Cstring, true::Cint)::Cstring

Если необходимо, строковый литерал также может быть использован непосредственно перед именем функции "libglib-2.0".g_uri_escape_string(...

исходный код

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

См. также cconvert

исходный код

Base.cconvertФункция

cconvert(T,x)

Преобразование x в значение для передачи в C-код как тип T, обычно вызывая convert(T, x).

В случаях, когда x не может быть безопасно преобразован в T, в отличие от convert, cconvert может вернуть объект типа, отличного от T, который, однако, подходит для unsafe_convert для обработки. Результат этой функции должен оставаться действительным (для сборки мусора) до тех пор, пока результат unsafe_convert больше не нужен. Это может быть использовано для выделения памяти, которая будет использоваться C-кодом. Если необходимо выделить несколько объектов, в качестве возвращаемого значения можно использовать кортеж из объектов.

Ни 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.

исходный код
END_OF_DOCUMENT_MARKER ```

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 или движок Julia, автоматически отключают sigint во время своего выполнения.

исходный код

Base.reenable_sigintФункция

reenable_sigint(f::Function)

Восстановление обработчика Ctrl-C во время выполнения функции. Временно отменяет действие disable_sigint.

исходный код

Base.exit_on_sigintФункция

exit_on_sigint(on::Bool)

Устанавливает флаг exit_on_sigint среды выполнения Julia. Если false, Ctrl-C (SIGINT) обрабатывается как InterruptException в try блоке. Это поведение по умолчанию в REPL, любой код, запущенный через -e и -E, а также в скриптах Julia, запущенных с -i параметром.

Если true, InterruptException не генерируется при Ctrl-C. Для выполнения кода при таком событии требуется atexit. Это поведение по умолчанию в скриптах Julia, запущенных без -i параметра.

Функция exit_on_sigint требует как минимум Julia 1.5.

исходный код

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). Дополнительно, для создания внутренних указателей на контейнеры (такие как массив или указатель), можно записать Ref(a, i) для создания ссылки на i-й элемент a.

При передаче в качестве аргумента ccall (либо как Ptr, либо Ref тип) объект Ref будет преобразован в собственный указатель на данные, на которые он ссылается.

В Julia нет недопустимого (NULL) Ref, но объект C_NULL типа Ptr может быть передан в аргумент ccall Ref.

Использование в широковещательной передаче

Ref иногда используется в широковещательной передаче, чтобы рассматривать ссылаемые значения как скалярные:

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 завершаются символом NUL. Для строк в стиле 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 завершаются символом NUL. Для строк в стиле 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.5.3/base/c/

Spec-Zone.ru

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