C Interface
Base.@ccall
— Macro@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 *)
مع متغير جوليا يسمى s
. انظر أيضًا ccall
.
تدعم varargs مع الاتفاقية التالية:
@ccall printf("%s = %d"::Cstring ; "foo"::Cstring, foo::Cint)::Cint
تستخدم الفاصلة المنقوطة لفصل المعاملات المطلوبة (التي يجب أن يكون هناك واحد على الأقل منها) عن المعاملات المتغيرة.
مثال باستخدام مكتبة خارجية:
# التوقيع C لـ 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
— Keywordccall((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
— Functioncglobal((symbol, library) [, type=Cvoid])
احصل على مؤشر لمتغير عالمي في مكتبة مشتركة تم تصديرها من C، محددًا تمامًا كما في ccall
. يُرجع Ptr{Type}
، مع افتراض Ptr{Cvoid}
إذا لم يتم تقديم وسيط Type
. يمكن قراءة القيم أو كتابتها بواسطة unsafe_load
أو unsafe_store!
، على التوالي.
Base.@cfunction
— Macro@cfunction(callable, ReturnType, (ArgumentTypes...,)) -> Ptr{Cvoid}
@cfunction($callable, ReturnType, (ArgumentTypes...,)) -> CFunction
قم بإنشاء مؤشر دالة قابلة للاستدعاء من C من دالة جوليا callable
للتوقيع النوعي المعطى. لاستخدام قيمة الإرجاع في ccall
، استخدم نوع المعامل Ptr{Cvoid}
في التوقيع.
لاحظ أن مجموعة أنواع المعاملات يجب أن تكون مجموعة حرفية، وليست متغير مجموعة أو تعبير (على الرغم من أنه يمكن أن تتضمن تعبير تفريغ). وستتم تقييم هذه المعاملات في النطاق العالمي أثناء وقت الترجمة (وليس مؤجلاً حتى وقت التشغيل). إضافة '$' أمام معامل الدالة يغير هذا لإنشاء إغلاق وقت التشغيل على المتغير المحلي 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
— TypeCFunction struct
معالج جمع القمامة لقيمة الإرجاع من @cfunction
عندما يتم تمييز الوسيط الأول بـ '$'. مثل جميع مقبضات cfunction
، يجب تمريرها إلى ccall
كـ Ptr{Cvoid}
، وسيتم تحويلها تلقائيًا في موقع الاستدعاء إلى النوع المناسب.
انظر @cfunction
.
Base.unsafe_convert
— Functionunsafe_convert(T, x)
قم بتحويل x
إلى وسيط C من النوع T
حيث يجب أن تكون القيمة المدخلة x
هي القيمة المرجعة من cconvert(T, ...)
.
في الحالات التي تحتاج فيها convert
إلى أخذ كائن جوليا وتحويله إلى Ptr
، يجب استخدام هذه الدالة لتعريف وإجراء ذلك التحويل.
كن حذرًا لضمان وجود مرجع جوليا لـ x
طالما سيتم استخدام نتيجة هذه الدالة. وبناءً عليه، يجب ألا يكون الوسيط x
في هذه الدالة تعبيرًا، بل يجب أن يكون اسم متغير أو مرجع حقل. على سبيل المثال، x=a.b.c
مقبول، لكن x=[a,b,c]
غير مقبول.
تشير البادئة unsafe
في هذه الدالة إلى أن استخدام نتيجة هذه الدالة بعد أن يصبح الوسيط x
في هذه الدالة غير متاح للبرنامج قد يتسبب في سلوك غير محدد، بما في ذلك تلف البرنامج أو أخطاء في الوصول إلى الذاكرة، في أي وقت لاحق.
انظر أيضًا cconvert
Base.cconvert
— Functioncconvert(T,x)
تحويل x
إلى قيمة يمكن تمريرها إلى كود C كنوع T
، عادةً عن طريق استدعاء convert(T, x)
.
في الحالات التي لا يمكن فيها تحويل x
بأمان إلى T
، على عكس convert
، قد تعيد cconvert
كائنًا من نوع مختلف عن T
، والذي يكون مع ذلك مناسبًا لـ unsafe_convert
للتعامل معه. يجب أن تظل نتيجة هذه الدالة صالحة (لـ GC) حتى لا تكون نتيجة unsafe_convert
مطلوبة بعد الآن. يمكن استخدام ذلك لتخصيص الذاكرة التي سيتم الوصول إليها بواسطة ccall
. إذا كانت هناك حاجة لتخصيص عدة كائنات، يمكن استخدام مجموعة من الكائنات كقيمة إرجاع.
لا ينبغي أن تأخذ convert
أو cconvert
كائنًا من جوليا وتحوله إلى Ptr
.
Base.unsafe_load
— Functionunsafe_load(p::Ptr{T}, i::Integer=1)
unsafe_load(p::Ptr{T}, order::Symbol)
unsafe_load(p::Ptr{T}, i::Integer, order::Symbol)
قم بتحميل قيمة من النوع T
من عنوان العنصر i
(بدءًا من 1) الموجود في p
. هذا يعادل التعبير C p[i-1]
. يمكن توفير ترتيب ذاكرة ذري بشكل اختياري.
تشير البادئة unsafe
في هذه الدالة إلى أنه لا يتم إجراء أي تحقق على المؤشر p
للتأكد من صحته. مثل C، يتحمل المبرمج مسؤولية ضمان عدم تحرير أو جمع الذاكرة المشار إليها أثناء استدعاء هذه الدالة. قد يؤدي الاستخدام غير الصحيح إلى تعطل برنامجك أو إرجاع إجابات غير صحيحة. على عكس C، قد يكون إلغاء مرجعية منطقة الذاكرة المخصصة كنوع مختلف صالحًا بشرط أن تكون الأنواع متوافقة.
حجة order
متاحة اعتبارًا من Julia 1.10.
انظر أيضًا: atomic
Base.unsafe_store!
— Functionunsafe_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)
قم بتخزين قيمة من النوع T
في عنوان العنصر i
(بدءًا من 1) الموجود في p
. هذا يعادل التعبير C p[i-1] = x
. يمكن أيضًا توفير ترتيب ذاكرة ذري اختياري.
تشير البادئة unsafe
في هذه الدالة إلى أنه لا يتم إجراء أي تحقق على المؤشر p
للتأكد من أنه صالح. مثل C، يتحمل المبرمج مسؤولية ضمان عدم تحرير الذاكرة المرجعية أو جمعها أثناء استدعاء هذه الدالة. قد يؤدي الاستخدام غير الصحيح إلى تعطل برنامجك. على عكس C، قد يكون تخزين منطقة الذاكرة المخصصة كنوع مختلف صالحًا بشرط أن تكون الأنواع متوافقة.
حجة order
متاحة اعتبارًا من Julia 1.10.
انظر أيضًا: atomic
Base.unsafe_modify!
— Functionunsafe_modify!(p::Ptr{T}, op, x, [order::Symbol]) -> Pair
تقوم هذه العمليات بشكل ذري بتنفيذ العمليات للحصول على عنوان الذاكرة وتعيينه بعد تطبيق الدالة op
. إذا كان مدعومًا من قبل الأجهزة (على سبيل المثال، الزيادة الذرية)، فقد يتم تحسين ذلك إلى تعليمات الأجهزة المناسبة، وإلا فإن تنفيذها سيكون مشابهًا لـ:
y = unsafe_load(p)
z = op(y, x)
unsafe_store!(p, z)
return y => z
تشير البادئة unsafe
في هذه الدالة إلى أنه لا يتم إجراء أي تحقق على المؤشر p
للتأكد من أنه صالح. مثل C، يتحمل المبرمج مسؤولية ضمان عدم تحرير الذاكرة المرجعية أو جمع القمامة أثناء استدعاء هذه الدالة. قد يؤدي الاستخدام غير الصحيح إلى تعطل برنامجك.
تتطلب هذه الدالة على الأقل Julia 1.10.
انظر أيضًا: modifyproperty!
, atomic
Base.unsafe_replace!
— Functionunsafe_replace!(p::Ptr{T}, expected, desired,
[success_order::Symbol[, fail_order::Symbol=success_order]]) -> (; old, success::Bool)
تقوم هذه العمليات بشكل ذري بالحصول على عنوان الذاكرة وتعيين قيمة معينة له بشكل شرطي. إذا كان مدعومًا من قبل الأجهزة، فقد يتم تحسين ذلك إلى التعليمات المناسبة للأجهزة، وإلا فإن تنفيذها سيكون مشابهًا لـ:
y = unsafe_load(p, fail_order)
ok = y === expected
if ok
unsafe_store!(p, desired, success_order)
end
return (; old = y, success = ok)
تشير البادئة unsafe
في هذه الدالة إلى أنه لا يتم إجراء أي تحقق على المؤشر p
للتأكد من أنه صالح. مثل C، يتحمل المبرمج مسؤولية ضمان عدم تحرير الذاكرة المرجعية أو جمعها أثناء استدعاء هذه الدالة. قد يؤدي الاستخدام غير الصحيح إلى تعطل برنامجك.
تتطلب هذه الدالة على الأقل Julia 1.10.
انظر أيضًا: replaceproperty!
, atomic
Base.unsafe_swap!
— Functionunsafe_swap!(p::Ptr{T}, x, [order::Symbol])
تقوم هذه العمليات بشكل ذري بتنفيذ العمليات للحصول على وتعيين عنوان الذاكرة في نفس الوقت. إذا كان مدعومًا من قبل الأجهزة، فقد يتم تحسين ذلك إلى التعليمات المناسبة للأجهزة، وإلا فإن تنفيذها سيكون مشابهًا لـ:
y = unsafe_load(p)
unsafe_store!(p, x)
return y
تشير البادئة unsafe
في هذه الدالة إلى أنه لا يتم إجراء أي تحقق على المؤشر p
للتأكد من أنه صالح. مثل C، يتحمل المبرمج مسؤولية ضمان عدم تحرير الذاكرة المرجعية أو جمعها أثناء استدعاء هذه الدالة. قد يؤدي الاستخدام غير الصحيح إلى تعطل برنامجك.
تتطلب هذه الدالة على الأقل Julia 1.10.
انظر أيضًا: swapproperty!
, atomic
Base.unsafe_copyto!
— Methodunsafe_copyto!(dest::Ptr{T}, src::Ptr{T}, N)
انسخ N
عنصرًا من مؤشر المصدر إلى وجهة، دون أي تحقق. يتم تحديد حجم العنصر بواسطة نوع المؤشرات.
تشير البادئة unsafe
في هذه الدالة إلى أنه لا يتم إجراء أي تحقق على المؤشرات dest
و src
للتأكد من أنها صالحة. قد يؤدي الاستخدام غير الصحيح إلى تلف أو تعطل برنامجك، بنفس الطريقة التي يحدث بها ذلك في C.
Base.unsafe_copyto!
— Methodunsafe_copyto!(dest::Array, do, src::Array, so, N)
انسخ N
عنصرًا من مصفوفة المصدر إلى مصفوفة الوجهة، بدءًا من الفهرس الخطي so
في المصدر و do
في الوجهة (مؤشر 1).
تشير البادئة unsafe
في هذه الدالة إلى أنه لا يتم إجراء أي تحقق للتأكد من أن N ضمن الحدود في أي من المصفوفتين. قد يؤدي الاستخدام غير الصحيح إلى تلف أو تعطل برنامجك، بنفس الطريقة التي يحدث بها ذلك في C.
Base.copyto!
— Functioncopyto!(B::AbstractMatrix, ir_dest::AbstractUnitRange, jr_dest::AbstractUnitRange,
tM::AbstractChar,
M::AbstractVecOrMat, ir_src::AbstractUnitRange, jr_src::AbstractUnitRange) -> B
نسخ عناصر المصفوفة M
إلى B
بكفاءة مشروطة على معلمة الحرف tM
كما يلي:
tM | الوجهة | المصدر |
---|---|---|
'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] |
يتم الكتابة فوق العناصر B[ir_dest, jr_dest]
. علاوة على ذلك، يجب أن تلبي معلمات نطاق الفهرس الشرط length(ir_dest) == length(ir_src)
و length(jr_dest) == length(jr_src)
.
انظر أيضًا copy_transpose!
و copy_adjoint!
.
copyto!(dest::AbstractMatrix, src::UniformScaling)
ي copies a UniformScaling
onto a matrix.
في جوليا 1.0، كانت هذه الطريقة تدعم فقط مصفوفة وجهة مربعة. أضافت جوليا 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 Vector{Float64}:
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
. يجب أن تتطابق أحجام المنطقتين.
أمثلة
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
Base.pointer
— Functionpointer(array [, index])
احصل على العنوان الأصلي لمصفوفة أو سلسلة، اختياريًا في موقع معين index
.
هذه الدالة "غير آمنة". كن حذرًا لضمان وجود مرجع جوليا لـ array
طالما سيتم استخدام هذا المؤشر. يجب استخدام ماكرو GC.@preserve
لحماية وسيط array
من جمع القمامة ضمن كتلة معينة من الشيفرة.
عادةً ما يكون استدعاء Ref(array[, index])
مفضلًا على هذه الدالة لأنه يضمن الصلاحية.
Base.unsafe_wrap
— Methodunsafe_wrap(Array, pointer::Ptr{T}, dims; own = false)
قم بلف كائن Array
في جوليا حول البيانات الموجودة في العنوان المعطى بواسطة pointer
، دون إنشاء نسخة. نوع عنصر المؤشر T
يحدد نوع عنصر المصفوفة. dims
إما عدد صحيح (لمصفوفة أحادية البعد) أو مجموعة من أبعاد المصفوفة. own
يحدد بشكل اختياري ما إذا كان يجب على جوليا أن تأخذ ملكية الذاكرة، من خلال استدعاء free
على المؤشر عندما لم تعد المصفوفة مرجعية.
تم تصنيف هذه الوظيفة على أنها "غير آمنة" لأنها ستنهار إذا لم يكن pointer
عنوان ذاكرة صالح للبيانات بالطول المطلوب. على عكس unsafe_load
و unsafe_store!
، فإن المبرمج مسؤول أيضًا عن ضمان عدم الوصول إلى البيانات الأساسية من خلال مصفوفتين من نوع عنصر مختلف، مشابهًا لقواعد التسمية الصارمة في C.
Base.pointer_from_objref
— Functionpointer_from_objref(x)
احصل على عنوان الذاكرة لكائن جوليا كـ Ptr
. لن يحمي وجود Ptr
الناتج الكائن من جمع القمامة، لذا يجب عليك التأكد من أن الكائن يظل مرجوعًا طوال الوقت الذي سيتم فيه استخدام Ptr
.
لا يمكن استدعاء هذه الدالة على الكائنات غير القابلة للتغيير، لأنها لا تحتوي على عناوين ذاكرة مستقرة.
انظر أيضًا unsafe_pointer_to_objref
.
Base.unsafe_pointer_to_objref
— Functionunsafe_pointer_to_objref(p::Ptr)
تحويل Ptr
إلى مرجع كائن. يفترض أن المؤشر يشير إلى كائن جوليا صالح تم تخصيصه في الذاكرة. إذا لم يكن هذا هو الحال، فإن السلوك غير محدد، وبالتالي تعتبر هذه الوظيفة "غير آمنة" ويجب استخدامها بحذر.
انظر أيضًا pointer_from_objref
.
Base.disable_sigint
— Functiondisable_sigint(f::Function)
تعطيل معالج Ctrl-C أثناء تنفيذ دالة على المهمة الحالية، لاستدعاء كود خارجي قد يستدعي كود جوليا الذي ليس آمناً من الانقطاع. من المقرر استدعاؤه باستخدام بناء جملة كتلة do
كما يلي:
disable_sigint() do
# كود غير آمن من الانقطاع
...
end
هذا غير مطلوب على خيوط العمل (Threads.threadid() != 1
) حيث سيتم تسليم InterruptException
فقط إلى الخيط الرئيسي. تقوم الدوال الخارجية التي لا تستدعي كود جوليا أو وقت تشغيل جوليا تلقائيًا بتعطيل sigint أثناء تنفيذها.
Base.reenable_sigint
— Functionreenable_sigint(f::Function)
إعادة تمكين معالج Ctrl-C أثناء تنفيذ دالة. يعكس مؤقتًا تأثير disable_sigint
.
Base.exit_on_sigint
— Functionexit_on_sigint(on::Bool)
قم بتعيين علامة exit_on_sigint
لوقت تشغيل جوليا. إذا كانت false
، يمكن التقاط Ctrl-C (SIGINT) كـ InterruptException
في كتلة try
. هذا هو السلوك الافتراضي في REPL، وأي كود يتم تشغيله عبر -e
و -E
وفي نص جوليا يتم تشغيله مع خيار -i
.
إذا كانت true
، فإن InterruptException
لا يتم رميها بواسطة Ctrl-C. يتطلب تشغيل الكود عند حدوث مثل هذا الحدث atexit
. هذا هو السلوك الافتراضي في نص جوليا الذي يتم تشغيله بدون خيار -i
.
تتطلب دالة exit_on_sigint
على الأقل جوليا 1.5.
Base.systemerror
— Functionsystemerror(sysfunc[, errno::Cint=Libc.errno()])
systemerror(sysfunc, iftrue::Bool)
يثير SystemError
لـ errno
مع السلسلة الوصفية sysfunc
إذا كانت iftrue
تساوي true
Base.windowserror
— Functionwindowserror(sysfunc[, code::UInt32=Libc.GetLastError()])
windowserror(sysfunc, iftrue::Bool)
مثل systemerror
، ولكن لوظائف واجهة برمجة التطبيقات في Windows التي تستخدم GetLastError
لإرجاع رمز خطأ بدلاً من تعيين errno
.
Core.Ptr
— TypePtr{T}
عنوان ذاكرة يشير إلى بيانات من النوع T
. ومع ذلك، لا يوجد ضمان بأن الذاكرة صالحة بالفعل، أو أنها تمثل فعليًا بيانات من النوع المحدد.
Core.Ref
— TypeRef{T}
كائن يشير بأمان إلى بيانات من النوع T
. هذا النوع مضمون للإشارة إلى ذاكرة صالحة تم تخصيصها بواسطة جوليا من النوع الصحيح. البيانات الأساسية محمية من التحرير بواسطة جامع القمامة طالما أن Ref
نفسه يتم الإشارة إليه.
في جوليا، يتم فك إشارة كائنات Ref
(تحميلها أو تخزينها) باستخدام []
.
عادةً ما يتم كتابة إنشاء Ref
لقيمة x
من النوع T
كـ Ref(x)
. بالإضافة إلى ذلك، لإنشاء مؤشرات داخلية للحاويات (مثل Array أو Ptr)، يمكن كتابتها كـ Ref(a, i)
لإنشاء إشارة إلى العنصر i
من a
.
Ref{T}()
ينشئ إشارة إلى قيمة من النوع T
بدون تهيئة. بالنسبة لنوع T
من نوع البت، ستكون القيمة هي ما يقيم حاليًا في الذاكرة المخصصة. بالنسبة لنوع T
غير من نوع البت، ستكون الإشارة غير محددة ومحاولة فك الإشارة عنها ستؤدي إلى خطأ، "UndefRefError: access to undefined reference".
للتحقق مما إذا كانت Ref
إشارة غير محددة، استخدم isassigned(ref::RefValue)
. على سبيل المثال، isassigned(Ref{T}())
هو false
إذا لم يكن T
من نوع البت. إذا كان T
من نوع البت، فإن isassigned(Ref{T}())
سيكون دائمًا صحيحًا.
عند تمريرها كوسيط ccall
(سواء كنوع Ptr
أو Ref
)، سيتم تحويل كائن Ref
إلى مؤشر أصلي للبيانات التي يشير إليها. بالنسبة لمعظم T
، أو عند تحويلها إلى Ptr{Cvoid}
، يكون هذا مؤشرًا إلى بيانات الكائن. عندما يكون T
من نوع isbits
، يمكن تعديل هذه القيمة بأمان، وإلا فإن التعديل هو سلوك غير محدد بشكل صارم.
كحالة خاصة، سيؤدي تعيين T = Any
بدلاً من ذلك إلى إنشاء مؤشر إلى الإشارة نفسها عند تحويلها إلى Ptr{Any}
(مؤشر jl_value_t const* const*
إذا كان T غير قابل للتغيير، وإلا مؤشر jl_value_t *const *
). عند تحويلها إلى Ptr{Cvoid}
، ستظل تعيد مؤشرًا إلى منطقة البيانات كما هو الحال مع أي T
آخر.
يمكن تمرير مثيل C_NULL
من Ptr
كوسيط ccall
Ref
لتهيئته.
الاستخدام في البث
يتم استخدام Ref
أحيانًا في البث من أجل التعامل مع القيم المشار إليها كقيمة عددية.
أمثلة
julia> r = Ref(5) # إنشاء Ref بقيمة أولية
Base.RefValue{Int64}(5)
julia> r[] # الحصول على قيمة من Ref
5
julia> r[] = 7 # تخزين قيمة جديدة في Ref
7
julia> r # الآن يحتوي Ref على 7
Base.RefValue{Int64}(7)
julia> isa.(Ref([1,2,3]), [Array, Dict, Int]) # التعامل مع القيم المرجعية كقيمة عددية أثناء البث
3-element BitVector:
1
0
0
julia> Ref{Function}() # إشارة غير محددة إلى نوع غير من نوع البت، Function
Base.RefValue{Function}(#undef)
julia> try
Ref{Function}()[] # فك إشارة عن إشارة غير محددة سيؤدي إلى خطأ
catch e
println(e)
end
UndefRefError()
julia> Ref{Int64}()[]; # إشارة إلى نوع من نوع البت تشير إلى قيمة غير محددة إذا لم يتم إعطاؤها
julia> isassigned(Ref{Int64}()) # إشارة إلى نوع من نوع البت تكون دائمًا مخصصة
true
Base.isassigned
— Methodisassigned(ref::RefValue) -> Bool
اختبر ما إذا كانت Ref
المعطاة مرتبطة بقيمة. هذا صحيح دائمًا بالنسبة لـ Ref
لكائن من نوع bitstype. أعد false
إذا كانت الإشارة غير معرفة.
أمثلة
julia> ref = Ref{Function}()
Base.RefValue{Function}(#undef)
julia> isassigned(ref)
false
julia> ref[] = (foobar(x) = x)
foobar (generic function with 1 method)
julia> isassigned(ref)
true
julia> isassigned(Ref{Int}())
true
Base.Cchar
— TypeCchar
يعادل نوع char
الأصلي في C.
Base.Cuchar
— TypeCuchar
يعادل نوع c الأصلي unsigned char
(UInt8
).
Base.Cshort
— TypeCshort
معادل لنوع c الأصلي signed short
(Int16
).
Base.Cstring
— TypeCstring
سلسلة نصية بأسلوب C تتكون من نوع الحرف الأصلي Cchar
s. Cstring
s هي منتهية بـ NUL. لسلاسل النصوص بأسلوب C المكونة من نوع الحرف العريض الأصلي، انظر Cwstring
. لمزيد من المعلومات حول التوافق بين السلاسل النصية و C، انظر الدليل.
Base.Cushort
— TypeCushort
معادل لنوع c الأصلي unsigned short
(UInt16
).
Base.Cint
— TypeCint
معادل لنوع c الأصلي signed int
(Int32
).
Base.Cuint
— TypeCuint
يعادل نوع c الأصلي unsigned int
(UInt32
).
Base.Clong
— TypeClong
يعادل نوع c الأصلي signed long
.
Base.Culong
— TypeCulong
يعادل نوع c الأصلي unsigned long
.
Base.Clonglong
— TypeClonglong
يعادل نوع c الأصلي signed long long
(Int64
).
Base.Culonglong
— TypeCulonglong
يعادل نوع C الأصلي unsigned long long
(UInt64
).
Base.Cintmax_t
— TypeCintmax_t
معادل لنوع c الأصلي intmax_t
(Int64
).
Base.Cuintmax_t
— TypeCuintmax_t
معادل لنوع c الأصلي uintmax_t
(UInt64
).
Base.Csize_t
— TypeCsize_t
يعادل نوع c الأصلي size_t
(UInt
).
Base.Cssize_t
— TypeCssize_t
يعادل نوع c الأصلي ssize_t
.
Base.Cptrdiff_t
— TypeCptrdiff_t
يعادل نوع ptrdiff_t
الأصلي في C (Int
).
Base.Cwchar_t
— TypeCwchar_t
معادل لنوع c الأصلي wchar_t
(Int32
).
Base.Cwstring
— TypeCwstring
سلسلة نصية بأسلوب C تتكون من نوع الحرف العريض الأصلي Cwchar_t
s. Cwstring
s مُنتهية بـ NUL. بالنسبة لسلاسل النصوص بأسلوب C المكونة من نوع الحرف الأصلي، انظر Cstring
. لمزيد من المعلومات حول التوافق بين السلاسل النصية وC، انظر الدليل.
Base.Cfloat
— TypeCfloat
معادل لنوع c الأصلي float
(Float32
).
Base.Cdouble
— TypeCdouble
يعادل نوع double
الأصلي في C (Float64
).
LLVM Interface
Core.Intrinsics.llvmcall
— Functionllvmcall(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, ...)
استدعاء كود LLVM المقدم في الوسيطة الأولى. هناك عدة طرق لتحديد هذه الوسيطة الأولى:
- كسلسلة حرفية، تمثل IR على مستوى الدالة (مماثلة لكتلة
define
في LLVM)، مع توفر الوسائط كمتغيرات SSA غير مسماة متتالية (%0، %1، إلخ)؛ - كزوج من العناصر، يحتوي على سلسلة من IR الخاصة بالوحدة وسلسلة تمثل اسم دالة نقطة الدخول للاستدعاء؛
- كزوج من العناصر، ولكن مع توفير الوحدة كـ
Vector{UInt8}
مع كود بت.
لاحظ أنه على عكس ccall
، يجب تحديد أنواع الوسائط كنوع زوجي، وليس كزوج من الأنواع. يجب تحديد جميع الأنواع، بالإضافة إلى كود LLVM، كأدلة حرفية، وليس كمتغيرات أو تعبيرات (قد يكون من الضروري استخدام @eval
لتوليد هذه الأدلة الحرفية).
المؤشرات الغامضة (المكتوبة كـ ptr
) غير مسموح بها في كود LLVM.
انظر test/llvmcall.jl
للحصول على أمثلة على الاستخدام.