FFI ile C İşlevlerini Çağırma
libc ve özel paylaşılan kitaplık işlevlerini Lua'dan ek yük olmadan çağırın.
FFI ile C İşlevlerini Çağırma, CoddyKit'te ücretsiz bir Lua Academy dersidir. Bu, 4 dersinin 2. 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.
Doğrudan C İşlevi Çağrıları
ffi.cdef ile bildirildikten sonra C işlevleri, kitaplık nesnesi üzerinden tıpkı Lua işlevleri gibi çağrılır. Bağımsız değişkenler ve dönüş değerleri otomatik olarak dönüştürülür.
local ffi = require("ffi")
ffi.cdef[[ double sin(double x); ]]
local m = ffi.load("m")
print(m.sin(math.pi / 2)) -- 1.0Tür Dönüştürme
Lua sayıları varsayılan olarak C double değerlerine dönüşür. FFI, bunları bildirilen C parametre türüne otomatik olarak dönüştürür. Boolean değerleri 0/1'e dönüşür. Dizeler const char* türüne dönüşür.
printf Çağırma
printf, değişken sayıda bağımsız değişken alan bir C işlevidir. Biçim dizeleri ve bağımsız değişkenlerle ffi.C.printf üzerinden çağırın.
ffi.cdef[[ int printf(const char *fmt, ...); ]]
ffi.C.printf("Sum: %d\n", 42)Dönüş Değerlerini İşleme
C dönüş değerleri otomatik olarak Lua türlerine dönüştürülür. Tamsayılar Lua sayılarına, char* değerleri lightuserdata'ya dönüşür (ffi.string ile dönüştürebilirsiniz).
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), bir char* işaretçisini Lua dizesine dönüştürür. len verilmezse bir null baytına kadar okur.
Hata İşleme
C işlevleri hata kodları döndürür veya errno değerini ayarlar. Dönüş değerlerini açıkça denetleyin. errno değerine ffi.errno() üzerinden erişin.
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())
endYapı Bağımsız Değişkenleri
C yapılarını değer veya işaretçi olarak geçirin. Bunları ffi.new ile oluşturun.
ffi.cdef[[
typedef struct { int x, y; } Point;
void printPoint(Point p);
]]
local p = ffi.new("Point", {x=3, y=4})
lib.printPoint(p)İşaretçi Bağımsız Değişkenleri
Birden çok değeri işaretçi parametreleri üzerinden döndüren işlevlere çıktı işaretçileri geçirin.
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])FFI Çağrı Performansı
C işlevlerine yönelik FFI çağrılarının ek yükü neredeyse yoktur; geleneksel C API'si üzerinden Lua'dan C'ye yapılan çağrılardan çok daha hızlıdır. JIT çoğu zaman çağrıyı tamamen satır içine alabilir.
Değişken Sayıda Bağımsız Değişken Alan İşlevler
Değişken sayıda bağımsız değişken alan C işlevleri (...) doğru türlerle çağrılmalıdır. Belirsizliği önlemek için gerekirse açık tür dönüştürmeleri kullanın.
ffi.C.printf("%d %f\n", ffi.cast("int", 42), ffi.cast("double", 3.14))Güvenlik Uygulamaları
İşaretçi dönüş değerlerini her zaman NULL ile karşılaştırın. Serbest bırakılmış veya kapsam dışındaki bir işaretçiyi asla geçirmeyin. C ayırmalarına sonlandırıcılar eklemek için ffi.gc kullanın.
FFI Çağrısı Sorusu
FFI, bir Lua dizesinin C const char* türüne dönüştürülmesini nasıl işler?
Özet: FFI ile C Çağırma
C işlevlerini, tıpkı Lua işlevleri gibi kitaplık nesnesi üzerinden çağırın. FFI tür dönüştürmeyi kendisi yapar. char* dönüşleri için ffi.string, hatalar için ffi.errno() ve yapı/dizi bağımsız değişkenleri için ffi.new kullanın.
Sıkça Sorulan Sorular
“FFI ile C İşlevlerini Çağırma” dersi ücretsiz mi?
Evet — “FFI ile C İşlevlerini Çağırma” 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.
“FFI ile C İşlevlerini Çağırma” dersinde ne öğreneceğim?
libc ve özel paylaşılan kitaplık işlevlerini Lua'dan ek yük olmadan çağırı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 2. dersidir.
“FFI ile C İşlevlerini Çağırma” 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