0Pricing
Lua Academy · درس

المؤشرات والبُنى والمصفوفات في FFI

تعامَل مع مؤشرات C وأنواع struct وتخصيصات المصفوفات في FFI

المؤشرات والبُنى والمصفوفات في FFI درس مجاني في Lua Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Lua Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Lua Academy 4 دروس في المجموع.

أنواع C في FFI

تدعم FFI جميع أنواع C القياسية: int وfloat وdouble وchar والمؤشرات والمصفوفات والبنى. عرّفوها في ffi.cdef.

إنشاء مصفوفات C

خصّصوا مصفوفة C باستخدام ffi.new("type[N]"). ويمكنكم الوصول إلى العناصر بفهرسة تبدأ من 0، وفق اصطلاح C.

local ffi = require("ffi")
local arr = ffi.new("int[5]", {10, 20, 30, 40, 50})
print(arr[0], arr[1], arr[4])  -- 10  20  50

المؤشرات

أنشئوا مؤشرًا إلى قيمة أو خصّصوا أنواع مؤشرات. استخدموا ptr[0] لإلغاء الإشارة.

local ffi = require("ffi")
local p = ffi.new("int[1]", 42)  -- int* pointing to 42
print(p[0])   -- 42
p[0] = 99
print(p[0])   -- 99

تعريف البنى والوصول إليها

عرّفوا بنية في cdef، ثم أنشئوا مثيلات باستخدام ffi.new ووصلوا إلى الحقول باستخدام صيغة النقطة.

ffi.cdef[[
  typedef struct {
    float x, y, z;
  } Vec3;
]]
local v = ffi.new("Vec3", 1.0, 2.0, 3.0)
print(v.x, v.y, v.z)

مصفوفة من البنى

أنشئوا مصفوفات من البنى لمعالجة البيانات دفعةً واحدة، وهو أسلوب شائع في محركات الألعاب والحوسبة العددية.

local particles = ffi.new("Vec3[1000]")
for i = 0, 999 do
  particles[i].x = i * 0.1
  particles[i].y = 0
  particles[i].z = 0
end

حساب المؤشرات

قدّموا المؤشر باستخدام ptr + n. فهذا يعيد مؤشرًا جديدًا مزاحًا بمقدار n من العناصر، وليس البايتات.

local arr = ffi.new("int[5]", {1,2,3,4,5})
local p = arr + 2   -- pointer to arr[2]
print(p[0])         -- 3

‏ffi.cast: تحويل النوع

تعيد ffi.cast(ctype, val) تفسير قيمة على أنها نوع C آخر. استخدموها بحذر، إذ تتسبب التحويلات الخاطئة في سلوك غير محدد.

local ffi = require("ffi")
local i = ffi.cast("int32_t", -1)
print(i)  -- -1
local u = ffi.cast("uint32_t", i)
print(u)  -- 4294967295

‏ffi.sizeof وffi.alignof

تعيد ffi.sizeof("Vec3") حجم نوع C بالبايت. وتعيد ffi.alignof متطلبات محاذاته.

‏ffi.gc: إرفاق دوال الإنهاء

ترفق ffi.gc(ptr, cleanup) دالة Lua بمؤشر C، بحيث تُستدعى عند جمع المؤشر بواسطة GC، مما يتيح تطبيق RAII على ذاكرة C.

local p = ffi.gc(ffi.C.malloc(1024), ffi.C.free)
-- p is automatically freed when GC collects it

التحقق من المؤشرات الفارغة

قارنوا المؤشرات مع nil، الذي يساوي مؤشر C NULL عند المقارنة باستخدام FFI.

local ptr = lib.allocate()
if ptr == nil then error("allocation failed") end

أداء مصفوفات C

تكون مصفوفات C التي يتم الوصول إليها عبر FFI أسرع بكثير من جداول Lua عند تخزين البيانات العددية، إذ لا تتطلب boxing أو البحث في جداول التجزئة أو فحوصات الأنواع.

سؤال حول مصفوفات FFI

ما الفهرس الذي تستخدمه FFI لمصفوفات C؟

مراجعة: المؤشرات والبنى والمصفوفات في FFI

أنشئوا مصفوفات C باستخدام ffi.new("type[N]")، مع فهرسة تبدأ من 0، ووصلوا إلى حقول البنى باستخدام صيغة النقطة، واستخدموا ffi.cast لإعادة تفسير الأنواع، وffi.gc لتنظيف ذاكرة C تلقائيًا.

الأسئلة الشائعة

هل درس «المؤشرات والبُنى والمصفوفات في FFI» مجاني؟

نعم — نص درس «المؤشرات والبُنى والمصفوفات في FFI» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Lua Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Lua Academy 4 دروس في المجموع.

ماذا ستتعلم في «المؤشرات والبُنى والمصفوفات في FFI»؟

تعامَل مع مؤشرات C وأنواع struct وتخصيصات المصفوفات في FFI تتمرن على Lua Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Lua Academy؟

لا تُشترط خبرة سابقة. Lua Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.

كم من الوقت يستغرق درس «المؤشرات والبُنى والمصفوفات في FFI»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Lua Academy هذا؟

نعم. كل درس في Lua Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. أساسيات FFI: ‏ffi.cdef وffi.load
  2. استدعاء دوال C عبر FFI
  3. المؤشرات والبُنى والمصفوفات في FFI
  4. دوال الاستدعاء العكسي: تمرير دوال Lua إلى C
← العودة إلى Lua Academy