Wskaźniki, struktury i tablice w FFI
Proszę pracować ze wskaźnikami C, typami struktur i alokacją tablic w FFI.
Wskaźniki, struktury i tablice w FFI to bezpłatna lekcja Lua Academy na CoddyKit. To lekcja 3 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.
Typy C w FFI
FFI obsługuje wszystkie standardowe typy C: int, float, double, char, wskaźniki, tablice i struktury. Należy zadeklarować je w ffi.cdef.
Tworzenie tablic C
Tablicę C należy zaalokować za pomocą ffi.new("type[N]"). Dostęp do elementów odbywa się z użyciem indeksowania od 0, zgodnie z konwencją C.
local ffi = require("ffi")
local arr = ffi.new("int[5]", {10, 20, 30, 40, 50})
print(arr[0], arr[1], arr[4]) -- 10 20 50Wskaźniki
Należy utworzyć wskaźnik do wartości lub zaalokować typy wskaźnikowe. Do wyłuskania wartości należy użyć ptr[0].
local ffi = require("ffi")
local p = ffi.new("int[1]", 42) -- int* pointing to 42
print(p[0]) -- 42
p[0] = 99
print(p[0]) -- 99Definiowanie i dostęp do struktur
Strukturę należy zadeklarować w cdef, następnie utworzyć jej wystąpienia za pomocą ffi.new i uzyskiwać dostęp do pól za pomocą notacji kropkowej.
ffi.cdef[[
typedef struct {
float x, y, z;
} Vec3;
]]
local v = ffi.new("Vec3", 1.0, 2.0, 3.0)
print(v.x, v.y, v.z)Tablica struktur
Tablice struktur służą do przetwarzania dużych ilości danych — są często używane w silnikach gier i obliczeniach numerycznych.
local particles = ffi.new("Vec3[1000]")
for i = 0, 999 do
particles[i].x = i * 0.1
particles[i].y = 0
particles[i].z = 0
endArytmetyka wskaźników
Wskaźnik można przesunąć za pomocą ptr + n. Zwraca to nowy wskaźnik przesunięty o n elementów, a nie bajtów.
local arr = ffi.new("int[5]", {1,2,3,4,5})
local p = arr + 2 -- pointer to arr[2]
print(p[0]) -- 3ffi.cast: rzutowanie typów
ffi.cast(ctype, val) interpretuje wartość jako inny typ C. Należy używać tego ostrożnie — niepoprawne rzutowania powodują niezdefiniowane zachowanie.
local ffi = require("ffi")
local i = ffi.cast("int32_t", -1)
print(i) -- -1
local u = ffi.cast("uint32_t", i)
print(u) -- 4294967295ffi.sizeof i ffi.alignof
ffi.sizeof("Vec3") zwraca rozmiar typu C w bajtach. ffi.alignof zwraca wymaganie dotyczące jego wyrównania.
ffi.gc: dołączanie finalizerów
ffi.gc(ptr, cleanup) dołącza funkcję Lua do wskaźnika C, aby została wywołana, gdy wskaźnik zostanie usunięty przez GC — umożliwia to stosowanie RAII dla pamięci C.
local p = ffi.gc(ffi.C.malloc(1024), ffi.C.free)
-- p is automatically freed when GC collects itSprawdzanie pustych wskaźników
Wskaźniki należy porównywać z nil (które w porównaniach FFI jest równoznaczne ze wskaźnikiem C NULL).
local ptr = lib.allocate()
if ptr == nil then error("allocation failed") endWydajność tablic C
Tablice C używane przez FFI są znacznie szybsze od tabel Lua w przypadku danych liczbowych — nie wymagają pakowania wartości, wyszukiwania haszującego ani sprawdzania typów.
Pytanie dotyczące tablic FFI
Jakie indeksowanie stosuje FFI dla tablic C?
Podsumowanie: wskaźniki, struktury i tablice w FFI
Tablice C należy tworzyć za pomocą ffi.new("type[N]") (indeksowanie od 0), do pól struktur uzyskiwać dostęp za pomocą notacji kropkowej, używać ffi.cast do zmiany interpretacji typu, a ffi.gc do automatycznego zwalniania pamięci C.
Często zadawane pytania
Czy lekcja „Wskaźniki, struktury i tablice w FFI” jest bezpłatna?
Tak — pełny tekst „Wskaźniki, struktury i tablice w 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 „Wskaźniki, struktury i tablice w FFI”?
Proszę pracować ze wskaźnikami C, typami struktur i alokacją tablic w FFI. Ć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 3 z 4.
Ile czasu zajmuje lekcja „Wskaźniki, struktury i tablice w 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