Geri Çağırmalar: Lua İşlevlerini C'ye Geçirme
Lua koduna geri çağrı yapan C geri çağırmaları oluşturmak için ffi.cast kullanın.
Geri Çağırmalar: Lua İşlevlerini C'ye Geçirme, CoddyKit'te ücretsiz bir Lua Academy dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Lua Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Lua Academy kursu toplamda 4 dersten oluşur.
C Geri Çağrıları Nedir?
Bazı C API'leri, C kodunun geri çağıracağı bir işlev işaretçisi geçirmenizi gerektirir. FFI'nin ffi.cast işlevi, Lua işlevlerinden C ile uyumlu işlev işaretçileri oluşturmanızı sağlar.
Geri Çağırma Türünü Bildirme
Önce işlev işaretçisi türünü cdef içinde bildirin.
local ffi = require("ffi")
ffi.cdef[[
typedef void (*callback_t)(int event, void *data);
void register_handler(callback_t cb);
]]Geri Çağrı Oluşturma
Bir Lua işlevini C geri çağrısı olarak sarmalamak için ffi.cast("callback_t", luaFunc) kullanın. Sonuç, C koduna geçirilebilen bir C işlev işaretçisidir.
local function myHandler(event, data)
print("Event:", event)
end
local cb = ffi.cast("callback_t", myHandler)
lib.register_handler(cb)Geri Çağrının Ömrü
Geri çağrı nesnesine Lua'da bir başvuru tutun (cb). Nesne GC tarafından toplanırsa C işlev işaretçisinin çağrılması çökmeye yol açar. Onu uzun ömürlü bir değişkende veya tabloda saklayın.
local callbacks = {} -- prevent GC
callbacks[#callbacks+1] = ffi.cast("callback_t", myHandler)
lib.register_handler(callbacks[#callbacks])C Karşılaştırıcısıyla Sıralama
Bir Lua karşılaştırıcısını FFI geri çağrısı aracılığıyla C'nin qsort işlevine geçirin.
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] .. " ") endGeri Çağrılar ve Eş Rutinler
C'den çağrılan Lua geri çağrıları askıya alınamaz (coroutine.yield çağrılamaz). C tarafı, Lua'nın eş rutin değiştirmesini desteklemez. Geri çağrıları askıya alınmayacak şekilde tasarlayın.
Geri Çağrılarda Upvalue'lar
Lua geri çağrıları, upvalue'ları normal şekilde yakalayabilir. Bu sayede geri çağrılar, genel değişkenler olmadan bağlama (ör. bir nesneye veya durum tablosuna) erişebilir.
local function makeHandler(ctx)
return ffi.cast("callback_t", function(event, _)
ctx.lastEvent = event -- upvalue access
end)
endSinyal İşleyicileri
Lua işlevlerini FFI aracılığıyla Unix sinyal işleyicileri olarak kaydedin. Dikkatli olun: sinyal işleyicilerinin çağırabileceği C işlevleri konusunda ciddi kısıtlamalar vardır.
Geri Çağrı Bellek Yönetimi
C tarafındaki kaydı kaldırdıktan sonra geri çağrıları cb:free() ile serbest bırakın. Geri çağrı nesnelerini sızdırmak belleği boşa harcar.
Alternatif: C Sarmalayıcı İşlevleri
Karmaşık tümleştirmelerde ince bir C ara katmanı, FFI geri çağrılarından daha temiz olabilir. Bu ara katman, C API'si üzerinden Lua'ya geri çağrı yaparak eş rutin ve hata işleme üzerinde tam denetim sağlar.
Performans
FFI geri çağrıları hızlıdır, ancak C'den Lua'ya köprü kurmak hazırlık ek yükü içerdiğinden doğrudan FFI çağrıları kadar hızlı değildir. Çok yüksek sıklıktaki geri çağrılar için (ör. ses) yalnızca C ile yazılmış uygulamaları değerlendirin.
Geri Çağrı Sorusu
Bir FFI geri çağrı nesnesine Lua referansını neden saklamanız gerekir?
Özet: FFI Geri Çağrıları
C uyumlu geri çağrılar oluşturmak için ffi.cast("fn_ptr_type", luaFunc) kullanın. Çöp toplayıcının nesneyi toplamasını önlemek için her zaman bir referans saklayın. Geri çağrılar yield yapamaz. Bağlamı geri çağrılara aktarmak için üst değerleri kullanın.
Sıkça Sorulan Sorular
“Geri Çağırmalar: Lua İşlevlerini C'ye Geçirme” dersi ücretsiz mi?
Evet — “Geri Çağırmalar: Lua İşlevlerini C'ye Geçirme” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Lua Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Lua Academy kursu toplamda 4 dersten oluşur.
“Geri Çağırmalar: Lua İşlevlerini C'ye Geçirme” dersinde ne öğreneceğim?
Lua koduna geri çağrı yapan C geri çağırmaları oluşturmak için ffi.cast kullanın. Lua Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
Lua Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te Lua Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.
“Geri Çağırmalar: Lua İşlevlerini C'ye Geçirme” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu Lua Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her Lua Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- FFI Temelleri: ffi.cdef ve ffi.load
- FFI ile C İşlevlerini Çağırma
- FFI'da İşaretçiler, Yapılar ve Diziler
- Geri Çağırmalar: Lua İşlevlerini C'ye Geçirme