0Pricing
Lua Academy · Lekcja

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  50

Wskaź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])   -- 99

Definiowanie 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
end

Arytmetyka 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])         -- 3

ffi.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)  -- 4294967295

ffi.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 it

Sprawdzanie 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") end

Wydajność 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

  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