Memanggil Fungsi C melalui FFI
Panggil fungsi libc dan pustaka bersama khusus dari Lua tanpa overhead.
Memanggil Fungsi C melalui FFI adalah pelajaran Lua Academy gratis di CoddyKit. Ini adalah pelajaran 2 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Lua Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Lua Academy mencakup 4 pelajaran total.
Pemanggilan Fungsi C Secara Langsung
Setelah dideklarasikan dengan ffi.cdef, fungsi C dipanggil sama seperti fungsi Lua melalui objek pustaka. Argumen dan nilai yang dikembalikan dikonversi secara otomatis.
local ffi = require("ffi")
ffi.cdef[[ double sin(double x); ]]
local m = ffi.load("m")
print(m.sin(math.pi / 2)) -- 1.0Konversi Tipe
Secara default, angka Lua menjadi C double. FFI secara otomatis mengonversinya ke tipe parameter C yang dideklarasikan. Boolean menjadi 0/1. String menjadi const char*.
Memanggil printf
printf adalah fungsi C variadik. Panggil melalui ffi.C.printf dengan string format dan argumen.
ffi.cdef[[ int printf(const char *fmt, ...); ]]
ffi.C.printf("Sum: %d\n", 42)Penanganan Nilai Kembalian
Nilai yang dikembalikan C secara otomatis dikonversi menjadi tipe Lua. Bilangan bulat menjadi angka Lua, sedangkan char* menjadi lightuserdata (gunakan ffi.string untuk mengonversinya).
ffi.cdef[[ char *getenv(const char *name); ]]
local ptr = ffi.C.getenv("HOME")
if ptr ~= nil then
print(ffi.string(ptr))
endffi.string
ffi.string(ptr, len) mengonversi pointer char* menjadi string Lua. Tanpa len, fungsi ini membaca hingga byte null.
Penanganan Kesalahan
Fungsi C mengembalikan kode kesalahan atau menetapkan errno. Periksa nilai kembalian secara eksplisit. Akses errno melalui ffi.errno().
ffi.cdef[[ int open(const char *path, int flags); ]]
local fd = ffi.C.open("missing.txt", 0)
if fd < 0 then
print("Error:", ffi.errno())
endArgumen Struct
Teruskan struct C berdasarkan nilai atau pointer. Buat struct tersebut dengan ffi.new.
ffi.cdef[[
typedef struct { int x, y; } Point;
void printPoint(Point p);
]]
local p = ffi.new("Point", {x=3, y=4})
lib.printPoint(p)Argumen Pointer
Teruskan pointer keluaran untuk fungsi yang mengembalikan beberapa nilai melalui parameter pointer.
ffi.cdef[[
void minmax(double *arr, int n, double *min, double *max);
]]
local arr = ffi.new("double[5]", {5,2,8,1,9})
local mn, mx = ffi.new("double[1]"), ffi.new("double[1]")
lib.minmax(arr, 5, mn, mx)
print(mn[0], mx[0])Kinerja Pemanggilan FFI
Pemanggilan FFI ke fungsi C memiliki overhead yang nyaris nol—jauh lebih cepat daripada pemanggilan Lua-ke-C melalui API C tradisional. JIT sering kali dapat melakukan inline terhadap seluruh pemanggilan.
Fungsi Variadik
Fungsi C variadik (...) harus dipanggil dengan tipe yang benar. Teruskan cast tipe eksplisit jika diperlukan untuk menghindari ambiguitas.
ffi.C.printf("%d %f\n", ffi.cast("int", 42), ffi.cast("double", 3.14))Praktik Keamanan
Selalu periksa nilai pointer yang dikembalikan terhadap NULL. Jangan pernah meneruskan pointer yang telah dibebaskan atau berada di luar cakupan. Gunakan ffi.gc untuk melampirkan finalizer pada alokasi C.
Pertanyaan tentang Pemanggilan FFI
Bagaimana FFI menangani konversi string Lua menjadi const char* C?
Ringkasan: Memanggil C melalui FFI
Panggil fungsi C melalui objek pustaka seperti halnya fungsi Lua. FFI menangani konversi tipe. Gunakan ffi.string untuk nilai char* yang dikembalikan, ffi.errno() untuk kesalahan, dan ffi.new untuk argumen struct/array.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Memanggil Fungsi C melalui FFI” gratis?
Ya — teks lengkap “Memanggil Fungsi C melalui FFI” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Lua Academy, upgrade ke CoddyKit PRO. Kursus Lua Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Memanggil Fungsi C melalui FFI”?
Panggil fungsi libc dan pustaka bersama khusus dari Lua tanpa overhead. Kamu berlatih Lua Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Lua Academy?
Tidak diperlukan pengalaman sebelumnya. Lua Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 2 dari 4.
Berapa lama pelajaran “Memanggil Fungsi C melalui FFI” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Lua Academy ini?
Ya. Setiap pelajaran Lua Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Dasar-Dasar FFI: ffi.cdef dan ffi.load
- Memanggil Fungsi C melalui FFI
- Pointer, Struct, dan Larik dalam FFI
- Callback: Meneruskan Fungsi Lua ke C