C Interface

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

Rufen Sie eine Funktion in einer C-exportierten Shared Library auf, die durch library.function_name angegeben ist, wobei library eine String-Konstante oder ein Literal ist. Die Bibliothek kann weggelassen werden, in diesem Fall wird der function_name im aktuellen Prozess aufgelöst. Alternativ kann @ccall auch verwendet werden, um einen Funktionszeiger $function_pointer aufzurufen, wie er beispielsweise von dlsym zurückgegeben wird.

Jeder argvalue zu @ccall wird in den entsprechenden argtype umgewandelt, indem automatisch Aufrufe von unsafe_convert(argtype, cconvert(argtype, argvalue)) eingefügt werden. (Siehe auch die Dokumentation für unsafe_convert und cconvert für weitere Details.) In den meisten Fällen führt dies einfach zu einem Aufruf von convert(argtype, argvalue).

Beispiele

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

Dies ruft die C-Standardbibliotheksfunktion auf:

size_t strlen(char *)

mit einer Julia-Variablen namens s. Siehe auch ccall.

Varargs werden mit der folgenden Konvention unterstützt:

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

Das Semikolon wird verwendet, um erforderliche Argumente (von denen mindestens eines vorhanden sein muss) von variadischen Argumenten zu trennen.

Beispiel mit einer externen Bibliothek:

# C-Signatur von 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

Das String-Literal könnte auch direkt vor dem Funktionsnamen verwendet werden, wenn gewünscht "libglib-2.0".g_uri_escape_string(...

source
ccallKeyword
ccall((function_name, library), returntype, (argtype1, ...), argvalue1, ...)
ccall(function_name, returntype, (argtype1, ...), argvalue1, ...)
ccall(function_pointer, returntype, (argtype1, ...), argvalue1, ...)

Rufen Sie eine Funktion in einer C-exportierten Shared Library auf, die durch das Tupel (function_name, library) angegeben ist, wobei jede Komponente entweder eine Zeichenkette oder ein Symbol ist. Anstelle der Angabe einer Bibliothek kann auch ein function_name-Symbol oder eine Zeichenkette verwendet werden, das im aktuellen Prozess aufgelöst wird. Alternativ kann ccall auch verwendet werden, um einen Funktionszeiger function_pointer aufzurufen, wie er beispielsweise von dlsym zurückgegeben wird.

Beachten Sie, dass das Tupel der Argumenttypen ein literales Tupel sein muss und keine Tupel-Variable oder -Ausdruck.

Jeder argvalue, der an den ccall übergeben wird, wird in den entsprechenden argtype umgewandelt, indem automatisch Aufrufe von unsafe_convert(argtype, cconvert(argtype, argvalue)) eingefügt werden. (Siehe auch die Dokumentation für unsafe_convert und cconvert für weitere Details.) In den meisten Fällen führt dies einfach zu einem Aufruf von convert(argtype, argvalue).

source
Core.Intrinsics.cglobalFunction
cglobal((symbol, library) [, type=Cvoid])

Erhalten Sie einen Zeiger auf eine globale Variable in einer C-exportierten Shared Library, die genau wie in ccall angegeben ist. Gibt einen Ptr{Type} zurück, der standardmäßig auf Ptr{Cvoid} gesetzt ist, wenn kein Type-Argument angegeben ist. Die Werte können mit unsafe_load oder unsafe_store! gelesen oder geschrieben werden.

source
Base.@cfunctionMacro
@cfunction(callable, Rückgabetyp, (ArgumentTypen...,)) -> Ptr{Cvoid}
@cfunction($callable, Rückgabetyp, (ArgumentTypen...,)) -> CFunction

Generieren Sie einen C-aufrufbaren Funktionszeiger aus der Julia-Funktion callable für die angegebene Typ-Signatur. Um den Rückgabewert an einen ccall zu übergeben, verwenden Sie den Argumenttyp Ptr{Cvoid} in der Signatur.

Beachten Sie, dass das Argumenttyp-Tupel ein literales Tupel sein muss und keine Tupel-Variable oder -Ausdruck (obwohl es einen Splat-Ausdruck enthalten kann). Und dass diese Argumente zur Compile-Zeit im globalen Gültigkeitsbereich ausgewertet werden (nicht bis zur Laufzeit verschoben). Ein '$' vor dem Funktionsargument ändert dies, um stattdessen eine Laufzeit-Closure über die lokale Variable callable zu erstellen (dies wird nicht auf allen Architekturen unterstützt).

Siehe Handbuchabschnitt zu ccall und cfunction Verwendung.

Beispiele

julia> function foo(x::Int, y::Int)
           return x + y
       end

julia> @cfunction(foo, Int, (Int, Int))
Ptr{Cvoid} @0x000000001b82fcd0
source
Base.CFunctionType
CFunction-Struktur

Garbage-Collection-Handle für den Rückgabewert von @cfunction, wenn das erste Argument mit '$' annotiert ist. Wie alle cfunction-Handles sollte es als Ptr{Cvoid} an ccall übergeben werden und wird am Aufrufort automatisch in den entsprechenden Typ konvertiert.

Siehe @cfunction.

source
Base.unsafe_convertFunction
unsafe_convert(T, x)

Konvertiere x in ein C-Argument vom Typ T, wobei der Eingabewert x der Rückgabewert von cconvert(T, ...) sein muss.

In Fällen, in denen convert ein Julia-Objekt in einen Ptr umwandeln müsste, sollte diese Funktion verwendet werden, um diese Umwandlung zu definieren und durchzuführen.

Sei vorsichtig, dass eine Julia-Referenz auf x so lange existiert, wie das Ergebnis dieser Funktion verwendet wird. Dementsprechend sollte das Argument x für diese Funktion niemals ein Ausdruck sein, sondern nur ein Variablenname oder ein Feldverweis. Zum Beispiel ist x=a.b.c akzeptabel, aber x=[a,b,c] ist es nicht.

Das Präfix unsafe bei dieser Funktion weist darauf hin, dass die Verwendung des Ergebnisses dieser Funktion, nachdem das x-Argument für diese Funktion nicht mehr für das Programm zugänglich ist, zu undefiniertem Verhalten führen kann, einschließlich Programmkorruption oder Segfaults, zu einem späteren Zeitpunkt.

Siehe auch cconvert

source
Base.cconvertFunction
cconvert(T,x)

Konvertiere x in einen Wert, der als Typ T an C-Code übergeben werden kann, typischerweise durch Aufruf von convert(T, x).

In Fällen, in denen x nicht sicher in T konvertiert werden kann, kann cconvert, im Gegensatz zu convert, ein Objekt eines Typs zurückgeben, der sich von T unterscheidet, das jedoch für unsafe_convert geeignet ist. Das Ergebnis dieser Funktion sollte gültig gehalten werden (für den GC), bis das Ergebnis von unsafe_convert nicht mehr benötigt wird. Dies kann verwendet werden, um Speicher zuzuweisen, der vom ccall verwendet wird. Wenn mehrere Objekte zugewiesen werden müssen, kann ein Tupel der Objekte als Rückgabewert verwendet werden.

Weder convert noch cconvert sollten ein Julia-Objekt nehmen und es in einen Ptr umwandeln.

source
Base.unsafe_loadFunction
unsafe_load(p::Ptr{T}, i::Integer=1)
unsafe_load(p::Ptr{T}, order::Symbol)
unsafe_load(p::Ptr{T}, i::Integer, order::Symbol)

Lädt einen Wert des Typs T von der Adresse des i-ten Elements (1-indiziert), beginnend bei p. Dies entspricht dem C-Ausdruck p[i-1]. Optional kann eine atomare Speicherreihenfolge angegeben werden.

Das Präfix unsafe bei dieser Funktion zeigt an, dass keine Validierung des Zeigers p durchgeführt wird, um sicherzustellen, dass er gültig ist. Wie in C ist der Programmierer dafür verantwortlich, sicherzustellen, dass der referenzierte Speicher nicht freigegeben oder garbage collected wird, während diese Funktion aufgerufen wird. Falsche Verwendung kann zu einem Segfault Ihres Programms führen oder fehlerhafte Antworten zurückgeben. Im Gegensatz zu C kann das Dereferenzieren eines Speicherbereichs, der als anderer Typ zugewiesen wurde, gültig sein, vorausgesetzt, die Typen sind kompatibel.

Julia 1.10

Das Argument order ist seit Julia 1.10 verfügbar.

Siehe auch: atomic

source
Base.unsafe_store!Function
unsafe_store!(p::Ptr{T}, x, i::Integer=1)
unsafe_store!(p::Ptr{T}, x, order::Symbol)
unsafe_store!(p::Ptr{T}, x, i::Integer, order::Symbol)

Speichert einen Wert des Typs T an der Adresse des i-ten Elements (1-indiziert), beginnend bei p. Dies entspricht dem C-Ausdruck p[i-1] = x. Optional kann eine atomare Speicherreihenfolge angegeben werden.

Das Präfix unsafe bei dieser Funktion zeigt an, dass keine Validierung des Zeigers p durchgeführt wird, um sicherzustellen, dass er gültig ist. Wie in C ist der Programmierer dafür verantwortlich, sicherzustellen, dass der referenzierte Speicher nicht freigegeben oder garbage collected wird, während diese Funktion aufgerufen wird. Falsche Verwendung kann zu einem Segfault Ihres Programms führen. Im Gegensatz zu C kann das Speichern in einem als anderem Typ zugewiesenen Speicherbereich gültig sein, vorausgesetzt, die Typen sind kompatibel.

Julia 1.10

Das Argument order ist seit Julia 1.10 verfügbar.

Siehe auch: atomic

source
Base.unsafe_modify!Function
unsafe_modify!(p::Ptr{T}, op, x, [order::Symbol]) -> Pair

Diese führen atomar die Operationen aus, um eine Speicheradresse zu lesen und zu setzen, nachdem die Funktion op angewendet wurde. Wenn dies von der Hardware unterstützt wird (zum Beispiel atomare Inkrementierung), kann dies auf die entsprechende Hardwareanweisung optimiert werden, andernfalls wird die Ausführung ähnlich sein wie:

y = unsafe_load(p)
z = op(y, x)
unsafe_store!(p, z)
return y => z

Das unsafe-Präfix bei dieser Funktion zeigt an, dass keine Validierung des Zeigers p durchgeführt wird, um sicherzustellen, dass er gültig ist. Wie in C ist der Programmierer dafür verantwortlich, sicherzustellen, dass der referenzierte Speicher nicht freigegeben oder garbage collected wird, während diese Funktion aufgerufen wird. Falsche Verwendung kann zu einem Segfault in Ihrem Programm führen.

Julia 1.10

Diese Funktion erfordert mindestens Julia 1.10.

Siehe auch: modifyproperty!, atomic

source
Base.unsafe_replace!Function
unsafe_replace!(p::Ptr{T}, expected, desired,
               [success_order::Symbol[, fail_order::Symbol=success_order]]) -> (; old, success::Bool)

Diese führen atomar die Operationen aus, um eine Speicheradresse auf einen gegebenen Wert zu erhalten und bedingt zu setzen. Wenn von der Hardware unterstützt, kann dies auf die entsprechende Hardwareanweisung optimiert werden, andernfalls wird die Ausführung ähnlich sein wie:

y = unsafe_load(p, fail_order)
ok = y === expected
if ok
    unsafe_store!(p, desired, success_order)
end
return (; old = y, success = ok)

Das unsafe-Präfix bei dieser Funktion zeigt an, dass keine Validierung des Zeigers p durchgeführt wird, um sicherzustellen, dass er gültig ist. Wie in C ist der Programmierer dafür verantwortlich, sicherzustellen, dass der referenzierte Speicher nicht freigegeben oder garbage collected wird, während diese Funktion aufgerufen wird. Falsche Verwendung kann zu einem Segfault in Ihrem Programm führen.

Julia 1.10

Diese Funktion erfordert mindestens Julia 1.10.

Siehe auch: replaceproperty!, atomic

source
Base.unsafe_swap!Function
unsafe_swap!(p::Ptr{T}, x, [order::Symbol])

Diese führen atomar die Operationen aus, um gleichzeitig eine Speicheradresse zu lesen und zu setzen. Wenn dies von der Hardware unterstützt wird, kann es auf die entsprechende Hardwareanweisung optimiert werden, andernfalls wird die Ausführung ähnlich sein wie:

y = unsafe_load(p)
unsafe_store!(p, x)
return y

Das unsafe-Präfix bei dieser Funktion zeigt an, dass keine Validierung des Zeigers p durchgeführt wird, um sicherzustellen, dass er gültig ist. Wie in C ist der Programmierer dafür verantwortlich, sicherzustellen, dass der referenzierte Speicher nicht freigegeben oder garbage collected wird, während diese Funktion aufgerufen wird. Falsche Verwendung kann zu einem Segfault in Ihrem Programm führen.

Julia 1.10

Diese Funktion erfordert mindestens Julia 1.10.

Siehe auch: swapproperty!, atomic

source
Base.unsafe_copyto!Method
unsafe_copyto!(dest::Ptr{T}, src::Ptr{T}, N)

Kopiere N Elemente von einem Quellzeiger zu einem Ziel, ohne Überprüfung. Die Größe eines Elements wird durch den Typ der Zeiger bestimmt.

Das unsafe Präfix dieser Funktion zeigt an, dass keine Validierung der Zeiger dest und src durchgeführt wird, um sicherzustellen, dass sie gültig sind. Falsche Verwendung kann dein Programm beschädigen oder einen Segfault verursachen, ähnlich wie in C.

source
Base.unsafe_copyto!Method
unsafe_copyto!(dest::Array, do, src::Array, so, N)

Kopiere N Elemente von einem Quellarray zu einem Zielarray, beginnend am linearen Index so im Quellarray und do im Zielarray (1-indiziert).

Das unsafe Präfix dieser Funktion zeigt an, dass keine Validierung durchgeführt wird, um sicherzustellen, dass N in beiden Arrays im zulässigen Bereich liegt. Falsche Verwendung kann dein Programm beschädigen oder einen Segfault verursachen, ähnlich wie in C.

source
Base.copyto!Function
copyto!(B::AbstractMatrix, ir_dest::AbstractUnitRange, jr_dest::AbstractUnitRange,
        tM::AbstractChar,
        M::AbstractVecOrMat, ir_src::AbstractUnitRange, jr_src::AbstractUnitRange) -> B

Effizient Elemente der Matrix M nach B kopieren, abhängig vom Zeichenparameter tM, wie folgt:

tMZielQuelle
'N'B[ir_dest, jr_dest]M[ir_src, jr_src]
'T'B[ir_dest, jr_dest]transpose(M)[ir_src, jr_src]
'C'B[ir_dest, jr_dest]adjoint(M)[ir_src, jr_src]

Die Elemente B[ir_dest, jr_dest] werden überschrieben. Darüber hinaus müssen die Indexbereichsparameter die Bedingung length(ir_dest) == length(ir_src) und length(jr_dest) == length(jr_src) erfüllen.

Siehe auch copy_transpose! und copy_adjoint!.

source
copyto!(dest::AbstractMatrix, src::UniformScaling)

Kopiert eine UniformScaling auf eine Matrix.

Julia 1.1

In Julia 1.0 unterstützte diese Methode nur eine quadratische Zielmatrix. Julia 1.1 fügte Unterstützung für eine rechteckige Matrix hinzu.

source
copyto!(dest, do, src, so, N)

Kopiere N Elemente aus der Sammlung src, beginnend am linearen Index so, in das Array dest, beginnend am Index do. Gib dest zurück.

source
copyto!(dest::AbstractArray, src) -> dest

Kopiere alle Elemente aus der Sammlung src in das Array dest, dessen Länge größer oder gleich der Länge n von src sein muss. Die ersten n Elemente von dest werden überschrieben, die anderen Elemente bleiben unverändert.

Siehe auch copy!, copy.

Warning

Das Verhalten kann unerwartet sein, wenn ein mutiertes Argument Speicher mit einem anderen Argument teilt.

Beispiele

julia> x = [1., 0., 3., 0., 5.];

julia> y = zeros(7);

julia> copyto!(y, x);

julia> y
7-element Vector{Float64}:
 1.0
 0.0
 3.0
 0.0
 5.0
 0.0
 0.0
source
copyto!(dest, Rdest::CartesianIndices, src, Rsrc::CartesianIndices) -> dest

Kopiere den Block von src im Bereich von Rsrc in den Block von dest im Bereich von Rdest. Die Größen der beiden Regionen müssen übereinstimmen.

Beispiele

julia> A = zeros(5, 5);

julia> B = [1 2; 3 4];

julia> Ainds = CartesianIndices((2:3, 2:3));

julia> Binds = CartesianIndices(B);

julia> copyto!(A, Ainds, B, Binds)
5×5 Matrix{Float64}:
 0.0  0.0  0.0  0.0  0.0
 0.0  1.0  2.0  0.0  0.0
 0.0  3.0  4.0  0.0  0.0
 0.0  0.0  0.0  0.0  0.0
 0.0  0.0  0.0  0.0  0.0
source
Base.pointerFunction
pointer(array [, index])

Holen Sie sich die native Adresse eines Arrays oder Strings, optional an einem bestimmten Ort index.

Diese Funktion ist "unsicher". Seien Sie vorsichtig, um sicherzustellen, dass eine Julia-Referenz auf array existiert, solange dieser Zeiger verwendet wird. Das GC.@preserve Makro sollte verwendet werden, um das array-Argument innerhalb eines bestimmten Codeblocks vor der Garbage Collection zu schützen.

Das Aufrufen von Ref(array[, index]) ist im Allgemeinen vorzuziehen, da es die Gültigkeit garantiert.

source
Base.unsafe_wrapMethod
unsafe_wrap(Array, pointer::Ptr{T}, dims; own = false)

Wickeln Sie ein Julia Array-Objekt um die Daten an der Adresse, die durch pointer angegeben ist, ohne eine Kopie zu erstellen. Der Zeiger-Elementtyp T bestimmt den Array-Elementtyp. dims ist entweder eine Ganzzahl (für ein 1d-Array) oder ein Tupel der Array-Dimensionen. own gibt optional an, ob Julia das Eigentum an dem Speicher übernehmen soll, indem free auf den Zeiger aufgerufen wird, wenn das Array nicht mehr referenziert wird.

Diese Funktion ist als "unsicher" gekennzeichnet, da sie abstürzt, wenn pointer keine gültige Speicheradresse für Daten der angeforderten Länge ist. Im Gegensatz zu unsafe_load und unsafe_store! ist der Programmierer auch dafür verantwortlich, sicherzustellen, dass auf die zugrunde liegenden Daten nicht über zwei Arrays mit unterschiedlichem Elementtyp zugegriffen wird, ähnlich der strengen Aliasregel in C.

source
Base.pointer_from_objrefFunction
pointer_from_objref(x)

Erhalten Sie die Speicheradresse eines Julia-Objekts als Ptr. Die Existenz des resultierenden Ptr schützt das Objekt nicht vor der Garbage Collection, daher müssen Sie sicherstellen, dass das Objekt während der gesamten Zeit, in der der Ptr verwendet wird, referenziert bleibt.

Diese Funktion darf nicht auf unveränderlichen Objekten aufgerufen werden, da diese keine stabilen Speicheradressen haben.

Siehe auch unsafe_pointer_to_objref.

source
Base.unsafe_pointer_to_objrefFunction
unsafe_pointer_to_objref(p::Ptr)

Konvertiert einen Ptr in eine Objektreferenz. Geht davon aus, dass der Zeiger auf ein gültiges, im Heap zugewiesenes Julia-Objekt verweist. Wenn dies nicht der Fall ist, führt dies zu undefiniertem Verhalten, weshalb diese Funktion als "unsicher" gilt und mit Vorsicht verwendet werden sollte.

Siehe auch pointer_from_objref.

source
Base.disable_sigintFunction
disable_sigint(f::Function)

Deaktiviert den Ctrl-C-Handler während der Ausführung einer Funktion im aktuellen Task, um externen Code aufzurufen, der möglicherweise Julia-Code aufruft, der nicht unterbrechungssicher ist. Soll mit der do-Block-Syntax wie folgt aufgerufen werden:

disable_sigint() do
    # unterbrechungsunsicherer Code
    ...
end

Dies ist in Arbeitsthreads (Threads.threadid() != 1) nicht erforderlich, da die InterruptException nur an den Master-Thread gesendet wird. Externe Funktionen, die keinen Julia-Code oder die Julia-Laufzeit aufrufen, deaktivieren automatisch sigint während ihrer Ausführung.

source
Base.exit_on_sigintFunction
exit_on_sigint(on::Bool)

Setze das exit_on_sigint-Flag der Julia-Laufzeit. Wenn false, kann Ctrl-C (SIGINT) als InterruptException im try-Block erfasst werden. Dies ist das Standardverhalten im REPL, bei jedem Code, der über -e und -E ausgeführt wird, und in Julia-Skripten, die mit der -i-Option ausgeführt werden.

Wenn true, wird InterruptException nicht durch Ctrl-C ausgelöst. Das Ausführen von Code bei einem solchen Ereignis erfordert atexit. Dies ist das Standardverhalten in Julia-Skripten, die ohne die -i-Option ausgeführt werden.

Julia 1.5

Die Funktion exit_on_sigint erfordert mindestens Julia 1.5.

source
Base.systemerrorFunction
systemerror(sysfunc[, errno::Cint=Libc.errno()])
systemerror(sysfunc, iftrue::Bool)

Löst einen SystemError für errno mit der beschreibenden Zeichenkette sysfunc aus, wenn iftrue true ist.

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

Wie systemerror, aber für Windows-API-Funktionen, die GetLastError verwenden, um einen Fehlercode zurückzugeben, anstatt errno zu setzen.

source
Core.PtrType
Ptr{T}

Eine Speicheradresse, die auf Daten des Typs T verweist. Es gibt jedoch keine Garantie, dass der Speicher tatsächlich gültig ist oder dass er tatsächlich Daten des angegebenen Typs darstellt.

source
Core.RefType
Ref{T}

Ein Objekt, das sicher auf Daten des Typs T verweist. Dieser Typ garantiert, dass er auf gültigen, in Julia zugewiesenen Speicher des richtigen Typs zeigt. Die zugrunde liegenden Daten sind vor der Freigabe durch den Garbage Collector geschützt, solange der Ref selbst referenziert wird.

In Julia werden Ref-Objekte mit [] dereferenziert (geladen oder gespeichert).

Die Erstellung eines Ref auf einen Wert x des Typs T wird normalerweise als Ref(x) geschrieben. Darüber hinaus kann für die Erstellung von Innenzeigern auf Container (wie Array oder Ptr) Ref(a, i) geschrieben werden, um eine Referenz auf das i-te Element von a zu erstellen.

Ref{T}() erstellt eine Referenz auf einen Wert des Typs T ohne Initialisierung. Für einen Bittyp T wird der Wert das sein, was derzeit im zugewiesenen Speicher vorhanden ist. Für einen Nicht-Bittyp T wird die Referenz undefiniert sein, und der Versuch, sie zu dereferenzieren, führt zu einem Fehler: "UndefRefError: Zugriff auf undefinierte Referenz".

Um zu überprüfen, ob ein Ref eine undefinierte Referenz ist, verwenden Sie isassigned(ref::RefValue). Zum Beispiel ist isassigned(Ref{T}()) false, wenn T kein Bittyp ist. Wenn T ein Bittyp ist, wird isassigned(Ref{T}()) immer true sein.

Wenn als ccall-Argument übergeben (entweder als Ptr oder Ref-Typ), wird ein Ref-Objekt in einen nativen Zeiger auf die Daten, auf die es verweist, umgewandelt. Für die meisten T oder wenn es in einen Ptr{Cvoid} umgewandelt wird, ist dies ein Zeiger auf die Objekt-Daten. Wenn T ein isbits-Typ ist, kann dieser Wert sicher verändert werden, andernfalls ist die Mutation strikt undefiniertes Verhalten.

In einem Sonderfall führt das Setzen von T = Any stattdessen zur Erstellung eines Zeigers auf die Referenz selbst, wenn es in einen Ptr{Any} umgewandelt wird (ein jl_value_t const* const*, wenn T unveränderlich ist, andernfalls ein jl_value_t *const *). Wenn es in einen Ptr{Cvoid} umgewandelt wird, gibt es weiterhin einen Zeiger auf den Datenbereich wie für jeden anderen T.

Eine C_NULL-Instanz von Ptr kann als ccall-Ref-Argument übergeben werden, um sie zu initialisieren.

Verwendung in Broadcasting

Ref wird manchmal im Broadcasting verwendet, um die referenzierten Werte als Skalar zu behandeln.

Beispiele

julia> r = Ref(5) # Erstellen Sie einen Ref mit einem Anfangswert
Base.RefValue{Int64}(5)

julia> r[] # Einen Wert aus einem Ref abrufen
5

julia> r[] = 7 # Einen neuen Wert in einen Ref speichern
7

julia> r # Der Ref enthält jetzt 7
Base.RefValue{Int64}(7)

julia> isa.(Ref([1,2,3]), [Array, Dict, Int]) # Referenzwerte während des Broadcastings als Skalar behandeln
3-element BitVector:
 1
 0
 0

julia> Ref{Function}()  # Undefinierte Referenz auf einen Nicht-Bittyp, Funktion
Base.RefValue{Function}(#undef)

julia> try
           Ref{Function}()[] # Dereferenzieren einer undefinierten Referenz führt zu einem Fehler
       catch e
           println(e)
       end
UndefRefError()

julia> Ref{Int64}()[]; # Eine Referenz auf einen Bittyp verweist auf einen unbestimmten Wert, wenn nicht angegeben

julia> isassigned(Ref{Int64}()) # Eine Referenz auf einen Bittyp ist immer zugewiesen
true
source
Base.isassignedMethod
isassigned(ref::RefValue) -> Bool

Überprüfen, ob die gegebene Ref mit einem Wert verknüpft ist. Dies ist immer wahr für eine Ref eines Bittyp-Objekts. Gibt false zurück, wenn die Referenz undefiniert ist.

Beispiele

julia> ref = Ref{Function}()
Base.RefValue{Function}(#undef)

julia> isassigned(ref)
false

julia> ref[] = (foobar(x) = x)
foobar (generische Funktion mit 1 Methode)

julia> isassigned(ref)
true

julia> isassigned(Ref{Int}())
true
source
Base.CstringType
Cstring

Ein C-ähnlicher String, der aus dem nativen Zeichentyp Cchars besteht. Cstrings sind NUL-terminiert. Für C-ähnliche Strings, die aus dem nativen breiten Zeichentyp bestehen, siehe Cwstring. Für weitere Informationen zur String-Interoperabilität mit C siehe das Handbuch.

source
Base.CwstringType
Cwstring

Ein C-ähnlicher String, der aus dem nativen Wide-Character-Typ Cwchar_ts besteht. Cwstrings sind NUL-terminiert. Für C-ähnliche Strings, die aus dem nativen Zeichentyp bestehen, siehe Cstring. Für weitere Informationen zur String-Interoperabilität mit C siehe das Handbuch.

source

LLVM Interface

Core.Intrinsics.llvmcallFunction
llvmcall(fun_ir::String, returntype, Tuple{argtype1, ...}, argvalue1, ...)
llvmcall((mod_ir::String, entry_fn::String), returntype, Tuple{argtype1, ...}, argvalue1, ...)
llvmcall((mod_bc::Vector{UInt8}, entry_fn::String), returntype, Tuple{argtype1, ...}, argvalue1, ...)

Rufen Sie den LLVM-Code auf, der im ersten Argument angegeben ist. Es gibt mehrere Möglichkeiten, dieses erste Argument anzugeben:

  • als Literalzeichenfolge, die IR auf Funktionsebene darstellt (ähnlich einem LLVM define-Block), wobei die Argumente als aufeinanderfolgende unbenannte SSA-Variablen (%0, %1 usw.) verfügbar sind;
  • als 2-Elemente-Tupel, das eine Zeichenfolge von Modul-IR und eine Zeichenfolge enthält, die den Namen der aufzurufenden Einstiegspunktfunktion darstellt;
  • als 2-Elemente-Tupel, jedoch mit dem Modul, das als Vector{UInt8} mit Bitcode bereitgestellt wird.

Beachten Sie, dass im Gegensatz zu ccall die Argumenttypen als Tupeltyp angegeben werden müssen und nicht als Tupel von Typen. Alle Typen sowie der LLVM-Code sollten als Literale und nicht als Variablen oder Ausdrücke angegeben werden (es kann erforderlich sein, @eval zu verwenden, um diese Literale zu generieren).

Opake Zeiger (geschrieben als ptr) sind im LLVM-Code nicht erlaubt.

Siehe test/llvmcall.jl für Anwendungsbeispiele.

source