0Pricing
Lua Academy · Lekcja

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.0

Konwersja 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))
end

ffi.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())
end

Argumenty 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

  1. Podstawy FFI: ffi.cdef i ffi.load
  2. Wywoływanie funkcji C przez FFI
  3. Wskaźniki, struktury i tablice w FFI
  4. Callbacki: przekazywanie funkcji Lua do C
← Powrót do Lua Academy