0Pricing
Lua Academy · Pelajaran

Callback: Meneruskan Fungsi Lua ke C

Gunakan ffi.cast untuk membuat callback C yang memanggil kembali kode Lua.

Callback: Meneruskan Fungsi Lua ke C adalah pelajaran Lua Academy gratis di CoddyKit. Ini adalah pelajaran 4 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.

Apa Itu Callback C?

Beberapa API C mengharuskan Anda meneruskan pointer fungsi yang akan dipanggil kembali oleh kode C. ffi.cast milik FFI memungkinkan Anda membuat pointer fungsi yang kompatibel dengan C dari fungsi Lua.

Mendeklarasikan Tipe Callback

Pertama-tama, deklarasikan tipe pointer fungsi dalam cdef.

local ffi = require("ffi")
ffi.cdef[[
  typedef void (*callback_t)(int event, void *data);
  void register_handler(callback_t cb);
]]

Membuat Callback

Gunakan ffi.cast("callback_t", luaFunc) untuk membungkus fungsi Lua sebagai callback C. Hasilnya adalah pointer fungsi C yang dapat diteruskan ke kode C.

local function myHandler(event, data)
  print("Event:", event)
end
local cb = ffi.cast("callback_t", myHandler)
lib.register_handler(cb)

Masa Hidup Callback

Simpan referensi Lua ke objek callback (cb). Jika objek tersebut menjalani GC, pemanggilan pointer fungsi C akan menyebabkan crash. Simpan objek itu dalam variabel atau tabel yang berumur panjang.

local callbacks = {}  -- prevent GC
callbacks[#callbacks+1] = ffi.cast("callback_t", myHandler)
lib.register_handler(callbacks[#callbacks])

Mengurutkan dengan Pembanding C

Teruskan pembanding Lua ke qsort milik C melalui callback FFI.

ffi.cdef[[
  typedef int (*cmp_t)(const void *a, const void *b);
  void qsort(void *base, size_t nmemb, size_t size, cmp_t cmp);
]]
local arr = ffi.new("int[5]", {3,1,4,1,5})
local cmp = ffi.cast("cmp_t", function(a, b)
  return ffi.cast("int*", a)[0] - ffi.cast("int*", b)[0]
end)
ffi.C.qsort(arr, 5, ffi.sizeof("int"), cmp)
for i = 0, 4 do io.write(arr[i] .. " ") end

Callback dan Coroutine

Callback Lua yang dipanggil dari C tidak dapat melakukan yield (memanggil coroutine.yield). Sisi C tidak mendukung perpindahan coroutine Lua. Rancang callback agar tidak melakukan yield.

Upvalue dalam Callback

Callback Lua dapat menangkap upvalue seperti biasa. Dengan demikian, callback dapat mengakses konteks (misalnya objek atau tabel status) tanpa variabel global.

local function makeHandler(ctx)
  return ffi.cast("callback_t", function(event, _)
    ctx.lastEvent = event  -- upvalue access
  end)
end

Penangan Sinyal

Daftarkan fungsi Lua sebagai penangan sinyal Unix melalui FFI. Berhati-hatilah: penangan sinyal memiliki batasan ketat mengenai fungsi C yang dapat dipanggilnya.

Manajemen Memori Callback

Lepaskan callback dengan cb:free() setelah membatalkan pendaftarannya dari sisi C. Callback yang bocor akan memboroskan memori.

Alternatif: Fungsi Pembungkus C

Untuk integrasi yang kompleks, lapisan tipis C mungkin lebih rapi daripada callback FFI. Lapisan tersebut memanggil kembali Lua melalui API C, sehingga Anda memiliki kendali penuh atas coroutine dan penanganan kesalahan.

Kinerja

Callback FFI cepat, tetapi tidak secepat pemanggilan FFI langsung karena jembatan C-ke-Lua memerlukan overhead penyiapan. Untuk callback yang sangat sering dipanggil, misalnya audio, pertimbangkan implementasi C murni.

Pertanyaan tentang Panggilan Balik

Mengapa Anda harus menyimpan referensi Lua ke objek panggilan balik FFI?

Ringkasan: Panggilan Balik FFI

Gunakan ffi.cast("fn_ptr_type", luaFunc) untuk membuat panggilan balik yang kompatibel dengan C. Selalu simpan referensi untuk mencegah pengumpulan sampah. Panggilan balik tidak dapat menyerahkan kendali. Gunakan nilai tertutup untuk meneruskan konteks ke panggilan balik.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Callback: Meneruskan Fungsi Lua ke C” gratis?

Ya — teks lengkap “Callback: Meneruskan Fungsi Lua ke C” 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 “Callback: Meneruskan Fungsi Lua ke C”?

Gunakan ffi.cast untuk membuat callback C yang memanggil kembali kode Lua. 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 4 dari 4.

Berapa lama pelajaran “Callback: Meneruskan Fungsi Lua ke C” 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

  1. Dasar-Dasar FFI: ffi.cdef dan ffi.load
  2. Memanggil Fungsi C melalui FFI
  3. Pointer, Struct, dan Larik dalam FFI
  4. Callback: Meneruskan Fungsi Lua ke C
← Kembali ke Lua Academy