0Pricing
Lua Academy · درس

استدعاء دوال Lua من C

حمّل نصوص Lua البرمجية ودوالها ونفّذها من شيفرة C

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

نظرة عامة

لاستدعاء دالة Lua من C: ادفعوا الدالة، ثم ادفعوا الوسائط، واستدعوا lua_pcall، ثم اقرؤوا النتائج من المكدس.

تحميل برنامج Lua النصي

تحمل luaL_dofile(L, filename) ملف Lua وتنفذه. أو استخدموا luaL_loadfile مع lua_pcall لفصل التحميل عن الاستدعاء.

// C code
if (luaL_dofile(L, "config.lua") != LUA_OK) {
  fprintf(stderr, "Error: %s\n", lua_tostring(L, -1));
  lua_pop(L, 1);
}

الحصول على دالة عامة

استخدموا lua_getglobal(L, "funcName") لدفع دالة Lua العامة إلى المكدس.

// C code
lua_getglobal(L, "myFunction"); // push function
lua_pushnumber(L, 10);          // push arg1
lua_pushnumber(L, 20);          // push arg2

lua_pcall

تستدعي lua_pcall(L, nargs, nresults, errfunc) الدالة الموجودة على المكدس. وعند النجاح، تعيد LUA_OK وتترك النتائج على المكدس.

// C code
if (lua_pcall(L, 2, 1, 0) != LUA_OK) {
  fprintf(stderr, "Call error: %s\n", lua_tostring(L, -1));
  lua_pop(L, 1);
} else {
  double result = lua_tonumber(L, -1);
  lua_pop(L, 1);
  printf("Result: %f\n", result);
}

قيم الإرجاع المتعددة

حدّدوا nresults في lua_pcall لقراءة قيم إرجاع متعددة. وتُدفع هذه القيم إلى المكدس بالترتيب.

// C: calling a Lua fn that returns two values
lua_getglobal(L, "minmax");
lua_pushnumber(L, 5); lua_pushnumber(L, 3);
lua_pcall(L, 2, 2, 0);
double mn = lua_tonumber(L, -2);
double mx = lua_tonumber(L, -1);
lua_pop(L, 2);

LUA_MULTRET

مرّروا LUA_MULTRET باعتبارها nresults لقبول جميع قيم الإرجاع من الدالة. وتحقّقوا من lua_gettop(L) بعد ذلك لمعرفة عدد القيم المُعادة.

معالج الأخطاء

مرّروا قيمة غير صفرية لـ errfunc إلى lua_pcall لاستخدام معالج أخطاء مخصّص. يتلقى المعالج كائن الخطأ ويمكنه إضافة معلومات تتبّع الاستدعاءات.

// C: setup traceback handler
lua_getglobal(L, "debug");
lua_getfield(L, -1, "traceback");
lua_remove(L, -2);  // remove debug table
int errhandler = lua_gettop(L);
// push fn and args, then:
lua_pcall(L, nargs, nresults, errhandler);

استدعاء أساليب الكائنات

لاستدعاء أسلوب كائن Lua: ادفعوا الأسلوب، ثم ادفعوا الكائن (self)، ثم ادفعوا الوسائط الأخرى، وبعدها أجروا الاستدعاء.

تمرير الجداول باعتبارها وسائط

أنشئوا جدولًا على المكدس باستخدام lua_newtable، واملؤوا حقوله باستخدام lua_setfield، ثم أدرجوه باعتباره وسيطًا للدالة.

سجل المراجع

استخدموا luaL_ref(L, LUA_REGISTRYINDEX) لتخزين قيمة Lua في السجل والحصول على مفتاح صحيح لاستردادها لاحقًا.

// C: store a callback for later use
lua_pushvalue(L, callbackIdx);
int ref = luaL_ref(L, LUA_REGISTRYINDEX);
// Later: lua_rawgeti(L, LUA_REGISTRYINDEX, ref);

التنظيف

اسحبوا دائمًا قيم المكدس غير المستخدمة. تتراكم المكدسات غير المتوازنة عبر الاستدعاءات الكثيرة وتؤدي في النهاية إلى تجاوز السعة. تحقّقوا من حجم المكدس في إصدارات التصحيح.

سؤال حول lua_pcall

ماذا يفعل lua_pcall(L, 2, 1, 0)؟

مراجعة: استدعاء Lua من C

ادفعوا الدالة والوسائط، واستدعوا lua_pcall، وتحقّقوا من رمز الإرجاع، ثم اقرؤوا النتائج من المكدس. استخدموا luaL_ref لتخزين استدعاءات Lua الراجعة لاستخدامها لاحقًا. واسحبوا دائمًا قيم المكدس غير المستخدمة.

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

هل درس «استدعاء دوال Lua من C» مجاني؟

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

ماذا ستتعلم في «استدعاء دوال Lua من C»؟

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

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

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

كم من الوقت يستغرق درس «استدعاء دوال Lua من C»؟

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

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

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

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

  1. نموذج مكدس Lua C API
  2. استدعاء دوال Lua من C
  3. تسجيل دوال C في Lua
  4. إدارة الحالة ومعالجة الأخطاء
← العودة إلى Lua Academy