C Interface

Base.@ccallMacro
@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(...

source
ccallKeyword
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).

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

احصل على مؤشر لمتغير عالمي في مكتبة مشتركة تم تصديرها من C، محددًا تمامًا كما في ccall. يُرجع Ptr{Type}، مع افتراض Ptr{Cvoid} إذا لم يتم تقديم وسيط Type. يمكن قراءة القيم أو كتابتها بواسطة unsafe_load أو unsafe_store!، على التوالي.

source
Base.@cfunctionMacro
@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
source
Base.CFunctionType
CFunction struct

معالج جمع القمامة لقيمة الإرجاع من @cfunction عندما يتم تمييز الوسيط الأول بـ '$'. مثل جميع مقبضات cfunction، يجب تمريرها إلى ccall كـ Ptr{Cvoid}، وسيتم تحويلها تلقائيًا في موقع الاستدعاء إلى النوع المناسب.

انظر @cfunction.

source
Base.unsafe_convertFunction
unsafe_convert(T, x)

قم بتحويل x إلى وسيط C من النوع T حيث يجب أن تكون القيمة المدخلة x هي القيمة المرجعة من cconvert(T, ...).

في الحالات التي تحتاج فيها convert إلى أخذ كائن جوليا وتحويله إلى Ptr، يجب استخدام هذه الدالة لتعريف وإجراء ذلك التحويل.

كن حذرًا لضمان وجود مرجع جوليا لـ x طالما سيتم استخدام نتيجة هذه الدالة. وبناءً عليه، يجب ألا يكون الوسيط x في هذه الدالة تعبيرًا، بل يجب أن يكون اسم متغير أو مرجع حقل. على سبيل المثال، x=a.b.c مقبول، لكن x=[a,b,c] غير مقبول.

تشير البادئة unsafe في هذه الدالة إلى أن استخدام نتيجة هذه الدالة بعد أن يصبح الوسيط x في هذه الدالة غير متاح للبرنامج قد يتسبب في سلوك غير محدد، بما في ذلك تلف البرنامج أو أخطاء في الوصول إلى الذاكرة، في أي وقت لاحق.

انظر أيضًا cconvert

source
Base.cconvertFunction
cconvert(T,x)

تحويل x إلى قيمة يمكن تمريرها إلى كود C كنوع T، عادةً عن طريق استدعاء convert(T, x).

في الحالات التي لا يمكن فيها تحويل x بأمان إلى T، على عكس convert، قد تعيد cconvert كائنًا من نوع مختلف عن T، والذي يكون مع ذلك مناسبًا لـ unsafe_convert للتعامل معه. يجب أن تظل نتيجة هذه الدالة صالحة (لـ GC) حتى لا تكون نتيجة unsafe_convert مطلوبة بعد الآن. يمكن استخدام ذلك لتخصيص الذاكرة التي سيتم الوصول إليها بواسطة ccall. إذا كانت هناك حاجة لتخصيص عدة كائنات، يمكن استخدام مجموعة من الكائنات كقيمة إرجاع.

لا ينبغي أن تأخذ convert أو cconvert كائنًا من جوليا وتحوله إلى Ptr.

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)

قم بتحميل قيمة من النوع T من عنوان العنصر i (بدءًا من 1) الموجود في p. هذا يعادل التعبير C p[i-1]. يمكن توفير ترتيب ذاكرة ذري بشكل اختياري.

تشير البادئة unsafe في هذه الدالة إلى أنه لا يتم إجراء أي تحقق على المؤشر p للتأكد من صحته. مثل C، يتحمل المبرمج مسؤولية ضمان عدم تحرير أو جمع الذاكرة المشار إليها أثناء استدعاء هذه الدالة. قد يؤدي الاستخدام غير الصحيح إلى تعطل برنامجك أو إرجاع إجابات غير صحيحة. على عكس C، قد يكون إلغاء مرجعية منطقة الذاكرة المخصصة كنوع مختلف صالحًا بشرط أن تكون الأنواع متوافقة.

Julia 1.10

حجة order متاحة اعتبارًا من Julia 1.10.

انظر أيضًا: 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)

قم بتخزين قيمة من النوع T في عنوان العنصر i (بدءًا من 1) الموجود في p. هذا يعادل التعبير C p[i-1] = x. يمكن أيضًا توفير ترتيب ذاكرة ذري اختياري.

تشير البادئة unsafe في هذه الدالة إلى أنه لا يتم إجراء أي تحقق على المؤشر p للتأكد من أنه صالح. مثل C، يتحمل المبرمج مسؤولية ضمان عدم تحرير الذاكرة المرجعية أو جمعها أثناء استدعاء هذه الدالة. قد يؤدي الاستخدام غير الصحيح إلى تعطل برنامجك. على عكس C، قد يكون تخزين منطقة الذاكرة المخصصة كنوع مختلف صالحًا بشرط أن تكون الأنواع متوافقة.

Julia 1.10

حجة order متاحة اعتبارًا من Julia 1.10.

انظر أيضًا: atomic

source
Base.unsafe_modify!Function
unsafe_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

تتطلب هذه الدالة على الأقل Julia 1.10.

انظر أيضًا: 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)

تقوم هذه العمليات بشكل ذري بالحصول على عنوان الذاكرة وتعيين قيمة معينة له بشكل شرطي. إذا كان مدعومًا من قبل الأجهزة، فقد يتم تحسين ذلك إلى التعليمات المناسبة للأجهزة، وإلا فإن تنفيذها سيكون مشابهًا لـ:

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

تتطلب هذه الدالة على الأقل Julia 1.10.

انظر أيضًا: replaceproperty!, atomic

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

تقوم هذه العمليات بشكل ذري بتنفيذ العمليات للحصول على وتعيين عنوان الذاكرة في نفس الوقت. إذا كان مدعومًا من قبل الأجهزة، فقد يتم تحسين ذلك إلى التعليمات المناسبة للأجهزة، وإلا فإن تنفيذها سيكون مشابهًا لـ:

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

تشير البادئة unsafe في هذه الدالة إلى أنه لا يتم إجراء أي تحقق على المؤشر p للتأكد من أنه صالح. مثل C، يتحمل المبرمج مسؤولية ضمان عدم تحرير الذاكرة المرجعية أو جمعها أثناء استدعاء هذه الدالة. قد يؤدي الاستخدام غير الصحيح إلى تعطل برنامجك.

Julia 1.10

تتطلب هذه الدالة على الأقل Julia 1.10.

انظر أيضًا: swapproperty!, atomic

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

انسخ N عنصرًا من مؤشر المصدر إلى وجهة، دون أي تحقق. يتم تحديد حجم العنصر بواسطة نوع المؤشرات.

تشير البادئة unsafe في هذه الدالة إلى أنه لا يتم إجراء أي تحقق على المؤشرات dest و src للتأكد من أنها صالحة. قد يؤدي الاستخدام غير الصحيح إلى تلف أو تعطل برنامجك، بنفس الطريقة التي يحدث بها ذلك في C.

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

انسخ N عنصرًا من مصفوفة المصدر إلى مصفوفة الوجهة، بدءًا من الفهرس الخطي so في المصدر و do في الوجهة (مؤشر 1).

تشير البادئة unsafe في هذه الدالة إلى أنه لا يتم إجراء أي تحقق للتأكد من أن N ضمن الحدود في أي من المصفوفتين. قد يؤدي الاستخدام غير الصحيح إلى تلف أو تعطل برنامجك، بنفس الطريقة التي يحدث بها ذلك في 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

نسخ عناصر المصفوفة 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!.

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

ي copies a UniformScaling onto a matrix.

جوليا 1.1

في جوليا 1.0، كانت هذه الطريقة تدعم فقط مصفوفة وجهة مربعة. أضافت جوليا 1.1 دعمًا لمصفوفة مستطيلة.

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

انسخ N عنصرًا من المجموعة src بدءًا من الفهرس الخطي so، إلى المصفوفة dest بدءًا من الفهرس do. ارجع بـ dest.

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

انسخ جميع العناصر من المجموعة src إلى المصفوفة dest، التي يجب أن يكون طولها أكبر من أو يساوي الطول n لـ src. يتم الكتابة فوق أول n عناصر من dest، بينما تظل العناصر الأخرى غير متأثرة.

انظر أيضًا copy!، copy.

!!! تحذير قد يكون السلوك غير متوقع عندما يتشارك أي وسيط معدل في الذاكرة مع أي وسيط آخر.

أمثلة

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

انسخ الكتلة من 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
source
Base.pointerFunction
pointer(array [, index])

احصل على العنوان الأصلي لمصفوفة أو سلسلة، اختياريًا في موقع معين index.

هذه الدالة "غير آمنة". كن حذرًا لضمان وجود مرجع جوليا لـ array طالما سيتم استخدام هذا المؤشر. يجب استخدام ماكرو GC.@preserve لحماية وسيط array من جمع القمامة ضمن كتلة معينة من الشيفرة.

عادةً ما يكون استدعاء Ref(array[, index]) مفضلًا على هذه الدالة لأنه يضمن الصلاحية.

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

قم بلف كائن Array في جوليا حول البيانات الموجودة في العنوان المعطى بواسطة pointer، دون إنشاء نسخة. نوع عنصر المؤشر T يحدد نوع عنصر المصفوفة. dims إما عدد صحيح (لمصفوفة أحادية البعد) أو مجموعة من أبعاد المصفوفة. own يحدد بشكل اختياري ما إذا كان يجب على جوليا أن تأخذ ملكية الذاكرة، من خلال استدعاء free على المؤشر عندما لم تعد المصفوفة مرجعية.

تم تصنيف هذه الوظيفة على أنها "غير آمنة" لأنها ستنهار إذا لم يكن pointer عنوان ذاكرة صالح للبيانات بالطول المطلوب. على عكس unsafe_load و unsafe_store!، فإن المبرمج مسؤول أيضًا عن ضمان عدم الوصول إلى البيانات الأساسية من خلال مصفوفتين من نوع عنصر مختلف، مشابهًا لقواعد التسمية الصارمة في C.

source
Base.pointer_from_objrefFunction
pointer_from_objref(x)

احصل على عنوان الذاكرة لكائن جوليا كـ Ptr. لن يحمي وجود Ptr الناتج الكائن من جمع القمامة، لذا يجب عليك التأكد من أن الكائن يظل مرجوعًا طوال الوقت الذي سيتم فيه استخدام Ptr.

لا يمكن استدعاء هذه الدالة على الكائنات غير القابلة للتغيير، لأنها لا تحتوي على عناوين ذاكرة مستقرة.

انظر أيضًا unsafe_pointer_to_objref.

source
Base.unsafe_pointer_to_objrefFunction
unsafe_pointer_to_objref(p::Ptr)

تحويل Ptr إلى مرجع كائن. يفترض أن المؤشر يشير إلى كائن جوليا صالح تم تخصيصه في الذاكرة. إذا لم يكن هذا هو الحال، فإن السلوك غير محدد، وبالتالي تعتبر هذه الوظيفة "غير آمنة" ويجب استخدامها بحذر.

انظر أيضًا pointer_from_objref.

source
Base.disable_sigintFunction
disable_sigint(f::Function)

تعطيل معالج Ctrl-C أثناء تنفيذ دالة على المهمة الحالية، لاستدعاء كود خارجي قد يستدعي كود جوليا الذي ليس آمناً من الانقطاع. من المقرر استدعاؤه باستخدام بناء جملة كتلة do كما يلي:

disable_sigint() do
    # كود غير آمن من الانقطاع
    ...
end

هذا غير مطلوب على خيوط العمل (Threads.threadid() != 1) حيث سيتم تسليم InterruptException فقط إلى الخيط الرئيسي. تقوم الدوال الخارجية التي لا تستدعي كود جوليا أو وقت تشغيل جوليا تلقائيًا بتعطيل sigint أثناء تنفيذها.

source
Base.exit_on_sigintFunction
exit_on_sigint(on::Bool)

قم بتعيين علامة exit_on_sigint لوقت تشغيل جوليا. إذا كانت false، يمكن التقاط Ctrl-C (SIGINT) كـ InterruptException في كتلة try. هذا هو السلوك الافتراضي في REPL، وأي كود يتم تشغيله عبر -e و -E وفي نص جوليا يتم تشغيله مع خيار -i.

إذا كانت true، فإن InterruptException لا يتم رميها بواسطة Ctrl-C. يتطلب تشغيل الكود عند حدوث مثل هذا الحدث atexit. هذا هو السلوك الافتراضي في نص جوليا الذي يتم تشغيله بدون خيار -i.

جوليا 1.5

تتطلب دالة exit_on_sigint على الأقل جوليا 1.5.

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

يثير SystemError لـ errno مع السلسلة الوصفية sysfunc إذا كانت iftrue تساوي true

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

مثل systemerror، ولكن لوظائف واجهة برمجة التطبيقات في Windows التي تستخدم GetLastError لإرجاع رمز خطأ بدلاً من تعيين errno.

source
Core.PtrType
Ptr{T}

عنوان ذاكرة يشير إلى بيانات من النوع T. ومع ذلك، لا يوجد ضمان بأن الذاكرة صالحة بالفعل، أو أنها تمثل فعليًا بيانات من النوع المحدد.

source
Core.RefType
Ref{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
source
Base.isassignedMethod
isassigned(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
source
Base.CstringType
Cstring

سلسلة نصية بأسلوب C تتكون من نوع الحرف الأصلي Cchars. Cstrings هي منتهية بـ NUL. لسلاسل النصوص بأسلوب C المكونة من نوع الحرف العريض الأصلي، انظر Cwstring. لمزيد من المعلومات حول التوافق بين السلاسل النصية و C، انظر الدليل.

source
Base.CwstringType
Cwstring

سلسلة نصية بأسلوب C تتكون من نوع الحرف العريض الأصلي Cwchar_ts. Cwstrings مُنتهية بـ NUL. بالنسبة لسلاسل النصوص بأسلوب C المكونة من نوع الحرف الأصلي، انظر Cstring. لمزيد من المعلومات حول التوافق بين السلاسل النصية وC، انظر الدليل.

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, ...)

استدعاء كود LLVM المقدم في الوسيطة الأولى. هناك عدة طرق لتحديد هذه الوسيطة الأولى:

  • كسلسلة حرفية، تمثل IR على مستوى الدالة (مماثلة لكتلة define في LLVM)، مع توفر الوسائط كمتغيرات SSA غير مسماة متتالية (%0، %1، إلخ)؛
  • كزوج من العناصر، يحتوي على سلسلة من IR الخاصة بالوحدة وسلسلة تمثل اسم دالة نقطة الدخول للاستدعاء؛
  • كزوج من العناصر، ولكن مع توفير الوحدة كـ Vector{UInt8} مع كود بت.

لاحظ أنه على عكس ccall، يجب تحديد أنواع الوسائط كنوع زوجي، وليس كزوج من الأنواع. يجب تحديد جميع الأنواع، بالإضافة إلى كود LLVM، كأدلة حرفية، وليس كمتغيرات أو تعبيرات (قد يكون من الضروري استخدام @eval لتوليد هذه الأدلة الحرفية).

المؤشرات الغامضة (المكتوبة كـ ptr) غير مسموح بها في كود LLVM.

انظر test/llvmcall.jl للحصول على أمثلة على الاستخدام.

source