Mendaftarkan Fungsi C dalam Lua
Dedahkan fungsi C kepada skrip Lua menggunakan luaL_register dan lua_pushcfunction.
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.
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
- Model Tindanan API C Lua
- Memanggil Fungsi Lua daripada C
- Mendaftarkan Fungsi C dalam Lua
- Mengurus Keadaan dan Pengendalian Ralat