Come registrare una funzione C in Lua, ma non in un contesto globale, ma come campo tabella?Funzione registro C nella tabella Lua
risposta
void register_c_function(char const * const tableName, char const * const funcName, CFunctionSignature funcPointer)
{
lua_getfield(lstate, LUA_GLOBALSINDEX, tableName); // push table onto stack
if (!lua_istable(lstate, -1)) // not a table, create it
{
lua_createtable(lstate, 0, 1); // create new table
lua_setfield(lstate, LUA_GLOBALSINDEX, tableName); // add it to global context
// reset table on stack
lua_pop(lstate, 1); // pop table (nil value) from stack
lua_getfield(lstate, LUA_GLOBALSINDEX, tableName); // push table onto stack
}
lua_pushstring(lstate, funcName); // push key onto stack
lua_pushcfunction(lstate, funcPointer); // push value onto stack
lua_settable(lstate, -3); // add key-value pair to table
lua_pop(lstate, 1); // pop table from stack
}
Questo è ciò che luaL_register()
è destinato a fare, per una o più funzioni. L'utilizzo canonica è come parte della configurazione per un modulo scritto in C:
/* actual definitions of modA() and modB() are left as an exercise. */
/* list of functions in the module */
static const luaL_reg modfuncs[] =
{
{ "a", modA},
{ "b", modB},
{ NULL, NULL }
};
/* module loader function called eventually by require"mod" */
int luaopen_mod(lua_State *L) {
luaL_register(L, "mod", modfuncs);
return 1;
}
dove questo crea un modulo denominato "mod" che ha due funzioni denominate mod.a
e mod.b
.
Citando il manuale luaL_register(L,libname,l)
:
Quando chiamato con
libname
pari aNULL
, registra semplicemente tutte funzioni incluse nell'elencol
(vediluaL_Reg
) nella tabella in cima alla pila .Quando chiamato con un non-null
libname
,luaL_register
crea una nuova tabellat
, imposta come valore della globale variabilelibname
, imposta come valore dipackage.loaded[libname]
e registri su di esso tutte le funzioni nell'elencol
. Se esiste una tabella inpackage.loaded[libname]
o nella variabilelibname
, riutilizza questa tabella anziché creando una nuova.In ogni caso la funzione lascia la tabella in cima alla pila.
luaL_register()
possono essere usati per mettere funzioni C in qualsiasi tabella passando NULL
per il suo secondo parametro finché la tabella è in cima alla pila.
Se esiste già una tabella mod con altri campi, verrà estesa o sostituita con una nuova dopo la chiamata a luaL_register()? –
riutilizzerà e aggiornerà una tabella precedente, secondo il manuale 5.1. – u0b34a0f6ae
Se applicato a una tabella globale denominata o alla tabella in cima allo stack, imposta solo i campi nominati nell'elenco di funzioni da registrare e lascia intatti altri campi. La differenza è che, dato un nome globale, crea anche la tabella se necessario e aggiunge un riferimento a 'package.loaded'. – RBerteig
- 1. Gli argomenti Lua passati alla funzione nella tabella sono nil
- 2. Chiamare la funzione Lua 5.2 da C++
- 3. Riferimento alla funzione Lua in C/C++
- 4. Ottieni dimensioni tabella Lua in C
- 5. Passare l'oggetto C++ alla funzione Lua
- 6. chiamando la funzione Lua
- 7. Funzione call lua C++ con parametri variabili
- 8. Safe Lua invoca la funzione registrata C++
- 9. Come analizzare una tabella Lua costante preferibilmente senza caricarla nella Lua VM?
- 10. Inserimento di coppie di chiavi nella tabella Lua
- 11. lua: itera su tutte le coppie nella tabella
- 12. Lua Tabella ordinamento 2 confronta
- 13. sottrarre tabella dalla tabella in Lua
- 14. Verificare se la funzione è in C o Lua implementata
- 15. accoda alla funzione lua
- 16. Ordina una tabella [] in Lua
- 17. Lua: Tabella prevista, ottenuto nulla
- 18. Iterare una tabella lua in c con una funzione di coppia personalizzata
- 19. Come restituire un array come tabella dalla funzione C a lua?
- 20. Incorpora Lua in C++
- 21. Lua Wrapper per C#?
- 22. Incorporamento Lua in C++
- 23. Implementazione multipiattaforma C# di Lua
- 24. Compilare lua incorporata in C
- 25. Come passare un tavolo da Lua in C++?
- 26. Come estrarre C++ puntatore oggetto da Lua
- 27. Trattare data utente come una tabella in Lua
- 28. Registro Watcher C#
- 29. Lua, cos'è Lua?
- 30. Trovare ogni combinazione di elementi in una tabella (Lua/PseudoCode)
Perché non usare solo luaL_register? – uroc