0Pricing
Lua Academy · Lezione

Puntatori, struct e array nella FFI

Lavori con puntatori C, tipi struct e allocazioni di array nella FFI.

Puntatori, struct e array nella FFI è una lezione Lua Academy gratuita su CoddyKit. Questa è la lezione 3 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Lua Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Lua Academy include 4 lezioni in totale.

Tipi C nell'FFI

L'FFI supporta tutti i tipi C standard: int, float, double, char, puntatori, array e struct. Li dichiari in ffi.cdef.

Creare array C

Allochi un array C con ffi.new("type[N]"). Acceda agli elementi con indicizzazione a partire da 0, secondo la convenzione 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

Puntatori

Crei un puntatore a un valore oppure allochi tipi puntatore. Utilizzi ptr[0] per dereferenziarlo.

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

Definire e accedere alle struct

Dichiari una struct in cdef, quindi crei istanze con ffi.new e acceda ai campi con la notazione a punto.

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)

Array di struct

Crei array di struct per elaborare grandi quantità di dati, come avviene comunemente nei motori di gioco e nel calcolo numerico.

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

Aritmetica dei puntatori

Faccia avanzare un puntatore con ptr + n. In questo modo viene restituito un nuovo puntatore spostato di n elementi, non di n byte.

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: conversione di tipo

ffi.cast(ctype, val) reinterpreta un valore come un altro tipo C. Lo utilizzi con cautela: cast errati causano un comportamento indefinito.

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 e ffi.alignof

ffi.sizeof("Vec3") restituisce la dimensione in byte di un tipo C. ffi.alignof restituisce il relativo requisito di allineamento.

ffi.gc: associare finalizzatori

ffi.gc(ptr, cleanup) associa una funzione Lua a un puntatore C, in modo che venga chiamata quando il puntatore viene raccolto dal GC, abilitando l'uso del pattern RAII per la memoria C.

local p = ffi.gc(ffi.C.malloc(1024), ffi.C.free)
-- p is automatically freed when GC collects it

Controllare i puntatori nulli

Confronti i puntatori con nil, che nei confronti FFI equivale al puntatore NULL C.

local ptr = lib.allocate()
if ptr == nil then error("allocation failed") end

Prestazioni degli array C

Gli array C acceduti tramite FFI sono significativamente più veloci delle tabelle Lua per i dati numerici: non richiedono boxing, ricerche hash o controlli dei tipi.

Domanda sugli array FFI

Quale indice utilizza l'FFI per gli array C?

Riepilogo: puntatori, struct e array nell'FFI

Crei array C con ffi.new("type[N]") (indicizzati a partire da 0), acceda ai campi delle struct con la notazione a punto, utilizzi ffi.cast per reinterpretare i tipi e ffi.gc per la pulizia automatica della memoria C.

Domande Frequenti

La lezione «Puntatori, struct e array nella FFI» è gratuita?

Sì — il testo completo di «Puntatori, struct e array nella FFI» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Lua Academy, passa a CoddyKit PRO. Il corso Lua Academy include 4 lezioni in totale.

Cosa imparerò in «Puntatori, struct e array nella FFI»?

Lavori con puntatori C, tipi struct e allocazioni di array nella FFI. Eserciti Lua Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare Lua Academy?

Non è richiesta alcuna esperienza precedente. Lua Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.

Quanto tempo richiede la lezione «Puntatori, struct e array nella FFI»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione Lua Academy?

Sì. Ogni lezione Lua Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Nozioni di base sulla FFI: ffi.cdef e ffi.load
  2. Chiamata delle funzioni C tramite FFI
  3. Puntatori, struct e array nella FFI
  4. Callback: passaggio di funzioni Lua a C
← Torna a Lua Academy