Wywoływanie funkcji C przez FFI
Proszę wywoływać funkcje libc i niestandardowych bibliotek współdzielonych z Lua bez dodatkowego narzutu.
Wywoływanie funkcji C przez FFI to bezpłatna lekcja Lua Academy na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Lua Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Lua Academy zawiera 4 lekcji w sumie.
Bezpośrednie wywołania funkcji C
Po zadeklarowaniu za pomocą ffi.cdef funkcje C wywołuje się dokładnie tak jak funkcje Lua, za pośrednictwem obiektu biblioteki. Argumenty i wartości zwracane są automatycznie konwertowane.
local ffi = require("ffi")
ffi.cdef[[ double sin(double x); ]]
local m = ffi.load("m")
print(m.sin(math.pi / 2)) -- 1.0Konwersja typów
Liczby Lua domyślnie stają się wartościami C typu double. FFI automatycznie konwertuje je na zadeklarowany typ parametru C. Wartości logiczne stają się wartościami 0/1. Napisy stają się wartościami typu const char*.
Wywoływanie printf
printf jest wariadyczną funkcją C. Należy wywoływać ją za pośrednictwem ffi.C.printf, przekazując napis formatujący i argumenty.
ffi.cdef[[ int printf(const char *fmt, ...); ]]
ffi.C.printf("Sum: %d\n", 42)Obsługa wartości zwracanych
Wartości zwracane przez C są automatycznie konwertowane na typy Lua. Liczby całkowite stają się liczbami Lua, a wartości char* stają się obiektami lightuserdata (do konwersji należy użyć ffi.string).
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) konwertuje wskaźnik char* na napis Lua. Bez argumentu len odczytuje dane aż do bajtu null.
Obsługa błędów
Funkcje C zwracają kody błędów lub ustawiają errno. Należy jawnie sprawdzać wartości zwracane. Dostęp do errno uzyskuje się przez 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())
endArgumenty będące strukturami
Struktury C można przekazywać przez wartość lub przez wskaźnik. Należy tworzyć je za pomocą 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)Argumenty będące wskaźnikami
W przypadku funkcji zwracających wiele wartości za pośrednictwem parametrów wskaźnikowych należy przekazywać wskaźniki wyjściowe.
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])Wydajność wywołań FFI
Wywołania funkcji C przez FFI mają niemal zerowy narzut — są znacznie szybsze niż wywołania Lua–C za pośrednictwem tradycyjnego API C. JIT często może całkowicie wstawić takie wywołanie.
Funkcje wariadyczne
Wariadyczne funkcje C (...) muszą być wywoływane z poprawnymi typami. W razie potrzeby należy przekazywać jawne rzutowania typów, aby uniknąć niejednoznaczności.
ffi.C.printf("%d %f\n", ffi.cast("int", 42), ffi.cast("double", 3.14))Zasady bezpieczeństwa
Należy zawsze sprawdzać, czy zwracane wskaźniki nie mają wartości NULL. Nie wolno przekazywać zwolnionego wskaźnika ani wskaźnika spoza jego zakresu ważności. Dołączanie finalizerów do alokacji C umożliwia ffi.gc.
Pytanie dotyczące wywołań FFI
Jak FFI konwertuje napis Lua na wartość C typu const char*?
Podsumowanie: wywoływanie C przez FFI
Funkcje C należy wywoływać za pośrednictwem obiektu biblioteki, tak jak funkcje Lua. FFI obsługuje konwersję typów. Do wartości char* należy używać ffi.string, do błędów ffi.errno(), a do argumentów będących strukturami lub tablicami — ffi.new.
Często zadawane pytania
Czy lekcja „Wywoływanie funkcji C przez FFI” jest bezpłatna?
Tak — pełny tekst „Wywoływanie funkcji C przez FFI” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Lua Academy, przejdź na CoddyKit PRO. Kurs Lua Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Wywoływanie funkcji C przez FFI”?
Proszę wywoływać funkcje libc i niestandardowych bibliotek współdzielonych z Lua bez dodatkowego narzutu. Ćwiczysz Lua Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Lua Academy?
Nie wymagamy żadnego doświadczenia. Lua Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.
Ile czasu zajmuje lekcja „Wywoływanie funkcji C przez FFI”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Lua Academy?
Tak. Każda lekcja Lua Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Podstawy FFI: ffi.cdef i ffi.load
- Wywoływanie funkcji C przez FFI
- Wskaźniki, struktury i tablice w FFI
- Callbacki: przekazywanie funkcji Lua do C