0Pricing
Lua Academy · บทเรียน

การเรียกฟังก์ชัน Lua จาก C

โหลดและเรียกใช้สคริปต์กับฟังก์ชัน Lua จากโค้ด C

การเรียกฟังก์ชัน Lua จาก C เป็นบทเรียน Lua Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 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” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Lua Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Lua Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การเรียกฟังก์ชัน Lua จาก C”

โหลดและเรียกใช้สคริปต์กับฟังก์ชัน Lua จากโค้ด C คุณปฏิบัติ Lua Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Lua Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Lua Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “การเรียกฟังก์ชัน Lua จาก C” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Lua Academy นี้ได้ไหม

ได้ บทเรียน Lua Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. แบบจำลองสแตกของ Lua C API
  2. การเรียกฟังก์ชัน Lua จาก C
  3. การลงทะเบียนฟังก์ชัน C ใน Lua
  4. การจัดการสถานะและข้อผิดพลาด
← กลับไปที่ Lua Academy