Lua Academy · Pelajaran

Mendaftarkan Fungsi C dalam Lua

Dedahkan fungsi C kepada skrip Lua menggunakan luaL_register dan lua_pushcfunction.

Pelajaran 3 daripada 413 langkah

Mendaftarkan Fungsi C dalam Lua ialah pelajaran Lua Academy percuma di CoddyKit. Ini ialah pelajaran 3 daripada 4. Sebanyak 3 pelajaran dalam laluan pembelajaran ini boleh dibaca sepenuhnya secara percuma — selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan praktikal dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Lua Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Lua Academy merangkumi sejumlah 4 pelajaran.

Gambaran Keseluruhan

Fungsi C boleh didedahkan kepada skrip Lua. Fungsi tersebut mesti mempunyai tandatangan int myFunc(lua_State *L). Fungsi ini membaca argumen daripada tindanan dan menolak nilai pulangan.

Tandatangan Fungsi C

Setiap fungsi yang boleh dipanggil daripada Lua ialah lua_CFunction: ia menerima lua_State*, membaca argumen, menolak hasil, dan mengembalikan bilangan hasil.

// C code
static int l_add(lua_State *L) {
  double a = luaL_checknumber(L, 1);
  double b = luaL_checknumber(L, 2);
  lua_pushnumber(L, a + b);
  return 1;  // one result
}

Mendaftar sebagai Global

lua_pushcfunction(L, l_add) menolak fungsi C, kemudian lua_setglobal(L, "add") mendaftarkannya sebagai global dalam Lua.

// C code
lua_pushcfunction(L, l_add);
lua_setglobal(L, "add");
// Now Lua can call: add(3, 4)

luaL_newlib / luaL_register

Daftarkan sekumpulan fungsi C sebagai modul Lua menggunakan tatasusunan luaL_Reg dan luaL_newlib.

// C code
static const luaL_Reg mylib[] = {
  {"add", l_add},
  {"mul", l_mul},
  {NULL, NULL}
};
luaL_newlib(L, mylib);
lua_setglobal(L, "mylib");
// Lua: mylib.add(1, 2)

Membaca Argumen

luaL_checknumber(L, n), luaL_checkstring(L, n) dan sebagainya membaca serta mengesahkan argumen, lalu menjana ralat Lua jika jenisnya salah.

Memulangkan Pelbagai Nilai

Tolak beberapa nilai dan pulangkan bilangannya. Lua akan menetapkannya sebagai nilai pulangan berbilang.

// C code
static int l_divmod(lua_State *L) {
  int a = luaL_checkinteger(L, 1);
  int b = luaL_checkinteger(L, 2);
  lua_pushinteger(L, a / b);
  lua_pushinteger(L, a % b);
  return 2;  // two results
}

Upvalue untuk Closure C

Closure C menangkap upvalue semasa pendaftaran menggunakan lua_pushcclosure(L, fn, n). Akses upvalue dengan lua_upvalueindex(n).

Melaporkan Ralat daripada C

Panggil luaL_error(L, format, ...) untuk menjana ralat Lua daripada fungsi C. Fungsi ini tidak pernah mengembalikan kawalan — ia melakukan longjmp kepada pengendali panggilan terlindung.

// C code
if (divisor == 0)
  luaL_error(L, "division by zero at argument %d", 2);

Modul C sebagai .so/.dll

Modul C mendedahkan fungsi luaopen_modname. require Lua memuatkan pustaka dikongsi dan memanggilnya untuk memulakan modul.

// C code (shared library entry point)
int luaopen_mymod(lua_State *L) {
  luaL_newlib(L, mymod_funcs);
  return 1;
}

Menyemak Bilangan Argumen

Gunakan lua_gettop(L) untuk menyemak bilangan argumen yang dihantar. luaL_checkany(L, n) memastikan sekurang-kurangnya n argumen telah diberikan.

Alternatif FFI LuaJIT

FFI LuaJIT membolehkan anda memanggil fungsi C terus daripada Lua tanpa menulis kod pembungkus C. Ia biasanya lebih mudah untuk panggilan fungsi tulen. API C diperlukan untuk penyepaduan yang lebih mendalam.

Soalan Fungsi C

Apakah yang mesti dipulangkan oleh fungsi C yang boleh dipanggil oleh Lua?

Ulang Kaji: Mendaftarkan Fungsi C

Fungsi C yang boleh dipanggil daripada Lua mempunyai tandatangan int f(lua_State*). Baca argumen dengan luaL_check*, tolak hasil, kemudian pulangkan bilangannya. Daftarkan satu demi satu dengan lua_pushcfunction atau secara pukal dengan luaL_newlib.

Percuma untuk bermula

Pelajari Lua dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
40
Pelajaran
159

Soalan Lazim

Adakah pelajaran “Mendaftarkan Fungsi C dalam Lua” percuma?

Ya — sebanyak 3 pelajaran dalam laluan pembelajaran Lua Academy, termasuk “Mendaftarkan Fungsi C dalam Lua”, boleh dibaca sepenuhnya secara percuma di web ini. Selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan interaktif dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Kursus Lua Academy merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Mendaftarkan Fungsi C dalam Lua”?

Dedahkan fungsi C kepada skrip Lua menggunakan luaL_register dan lua_pushcfunction. Anda berlatih Lua Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Lua Academy?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Lua Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 3 daripada 4.

Berapa lamakah pelajaran “Mendaftarkan Fungsi C dalam Lua” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Lua Academy ini?

Ya. Setiap pelajaran Lua Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Model Tindanan API C Lua
  2. Memanggil Fungsi Lua daripada C
  3. Mendaftarkan Fungsi C dalam Lua
  4. Mengurus Keadaan dan Pengendalian Ralat
← Kembali ke Lua Academy