Lua Academy · Les

Callbacks: Lua-functies aan C doorgeven

Gebruik ffi.cast om C-callbacks te maken die terugbellen naar Lua-code

Les 4 van 413 stappen

Callbacks: Lua-functies aan C doorgeven is een gratis Lua Academy-les op CoddyKit. Dit is les 4 van 4. Je kunt 3 lessen uit dit leerpad gratis volledig lezen — daarna ontgrendelt CoddyKit PRO alle lessen, plus praktische oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject Lua Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Lua Academy bevat in totaal 4 lessen.

Wat zijn C-callbacks?

Voor sommige C-API's moet je een functiepointer doorgeven die de C-code later aanroept. Met ffi.cast van de FFI kun je C-compatibele functiepointers van Lua-functies maken.

Een callbacktype declareren

Declareer eerst het type van de functiepointer in cdef.

local ffi = require("ffi")
ffi.cdef[[
  typedef void (*callback_t)(int event, void *data);
  void register_handler(callback_t cb);
]]

Een callback maken

Gebruik ffi.cast("callback_t", luaFunc) om een Lua-functie als C-callback te verpakken. Het resultaat is een C-functiepointer die aan C-code kan worden doorgegeven.

local function myHandler(event, data)
  print("Event:", event)
end
local cb = ffi.cast("callback_t", myHandler)
lib.register_handler(cb)

Levensduur van callbacks

Houd een Lua-verwijzing naar het callbackobject (cb) bij. Als het door GC wordt opgeruimd, crasht een aanroep van de C-functiepointer. Sla het op in een variabele of tabel met een lange levensduur.

local callbacks = {}  -- prevent GC
callbacks[#callbacks+1] = ffi.cast("callback_t", myHandler)
lib.register_handler(callbacks[#callbacks])

Sorteren met een C-vergelijkingsfunctie

Geef via een FFI-callback een Lua-vergelijkingsfunctie door aan C's qsort.

ffi.cdef[[
  typedef int (*cmp_t)(const void *a, const void *b);
  void qsort(void *base, size_t nmemb, size_t size, cmp_t cmp);
]]
local arr = ffi.new("int[5]", {3,1,4,1,5})
local cmp = ffi.cast("cmp_t", function(a, b)
  return ffi.cast("int*", a)[0] - ffi.cast("int*", b)[0]
end)
ffi.C.qsort(arr, 5, ffi.sizeof("int"), cmp)
for i = 0, 4 do io.write(arr[i] .. " ") end

Callbacks en coroutines

Lua-callbacks die vanuit C worden aangeroepen, kunnen niet yielden (geen coroutine.yield aanroepen). De C-kant ondersteunt de coroutinewissel van Lua niet. Ontwerp callbacks zo dat ze niet yielden.

Upvalues in callbacks

Lua-callbacks kunnen normaal upvalues vastleggen. Zo krijgen callbacks toegang tot context (bijvoorbeeld een object of statustabel) zonder globale variabelen.

local function makeHandler(ctx)
  return ffi.cast("callback_t", function(event, _)
    ctx.lastEvent = event  -- upvalue access
  end)
end

Signaalafhandelaars

Registreer Lua-functies als Unix-signaalafhandelaars via FFI. Wees voorzichtig: signaalafhandelaars kennen strenge beperkingen voor de C-functies die ze mogen aanroepen.

Geheugenbeheer van callbacks

Geef callbacks vrij met cb:free() nadat je ze aan de C-kant hebt afgemeld. Lekkende callbackobjecten verspillen geheugen.

Alternatief: C-wrapperfuncties

Voor complexe integraties kan een dunne C-shim overzichtelijker zijn dan FFI-callbacks. De shim roept Lua aan via de C-API, waardoor je volledige controle hebt over coroutines en foutafhandeling.

Prestaties

FFI-callbacks zijn snel, maar niet zo snel als rechtstreekse FFI-aanroepen, omdat de brug van C naar Lua insteloverhead met zich meebrengt. Overweeg voor callbacks met een zeer hoge frequentie (bijvoorbeeld audio) pure C-implementaties.

Vraag over callbacks

Waarom moet je een Lua-referentie naar een FFI-callbackobject bewaren?

Samenvatting: FFI-callbacks

Gebruik ffi.cast("fn_ptr_type", luaFunc) om C-compatibele callbacks te maken. Bewaar altijd een referentie om garbagecollection te voorkomen. Callbacks kunnen niet yielden. Gebruik upvalues om context aan callbacks door te geven.

Gratis beginnen

Leer Lua met een AI-tutor — gratis

Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.

Cursussen
40
Lessen
159

Veelgestelde vragen

Is de les “Callbacks: Lua-functies aan C doorgeven” gratis?

Ja — je kunt hier op het web alle 3 lessen van het leerpad Lua Academy, waaronder “Callbacks: Lua-functies aan C doorgeven”, gratis volledig lezen. Daarna ontgrendelt CoddyKit PRO alle lessen, plus interactieve oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. De cursus Lua Academy bevat in totaal 4 lessen.

Wat leer ik in “Callbacks: Lua-functies aan C doorgeven”?

Gebruik ffi.cast om C-callbacks te maken die terugbellen naar Lua-code Je oefent met Lua Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.

Heb ik ervaring nodig om met Lua Academy te beginnen?

Ervaring vooraf is niet nodig. Lua Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 4 van 4.

Hoe lang duurt de les “Callbacks: Lua-functies aan C doorgeven”?

De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.

Kan ik code schrijven en uitvoeren in deze les over Lua Academy?

Ja. Elke les over Lua Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.

Alle lessen in deze cursus

  1. FFI-basisprincipes: ffi.cdef en ffi.load
  2. C-functies aanroepen via FFI
  3. Pointers, structs en arrays in FFI
  4. Callbacks: Lua-functies aan C doorgeven
← Terug naar Lua Academy