2013-05-06 15 views
5

Scriverò un programma utilizzando lua fo AI, quindi sto cercando di farlo funzionare insieme. Ma quando provo a caricare uno script lua dal mio file cpp ho questo messaggio di errore:Script Lua con C++: tentativo di indicizzare 'io' globale (valore nullo)

-- toto.lua:1: attempt to index global 'io' (a nil value) 

Ecco il mio script Lua:

io.write("Running ", _VERSION, "\n")

e qui è il mio file cpp :

void report_errors(lua_State *L, int status) 
{ 
    if (status!=0) { 
    std::cerr << "-- " << lua_tostring(L, -1) << std::endl; 
    lua_pop(L, 1); // remove error message                
    } 
} 



int main(int argc, char** argv) 
{ 
    for (int n=1; n<argc; ++n) { 
    const char* file = argv[n]; 

    lua_State *L = luaL_newstate(); 

    luaopen_io(L); // provides io.*                 
    luaopen_base(L); 
    luaopen_table(L); 
    luaopen_string(L); 
    luaopen_math(L); 

    std::cerr << "-- Loading file: " << file << std::endl; 

    int s = luaL_loadfile(L, file); 

    if (s==0) { 
    s = lua_pcall(L, 0, LUA_MULTRET, 0); 
    } 

    report_errors(L, s); 
    lua_close(L); 
    std::cerr << std::endl; 
    } 
    return 0; 
    } 

Grazie mille.

+0

Il codice crea uno stato Lua separato per ogni file che esegue. Ciò impedirà la comunicazione di file diversi. Questo potrebbe non essere quello che vuoi. – lhf

risposta

4

Non chiamare direttamente le funzioni luaopen_ *. Utilizzare luaL_openlibs o luaL_requiref invece:

luaL_requiref(L, "io", luaopen_io, 1); 

La particolare problema qui è che luaopen_io non memorizza la tabella modulo _G, quindi la denuncia che io è un valore nil. Dai un'occhiata al codice sorgente di luaL_requiref in lauxlib.c se vuoi conoscere i dettagli cruenti.

+0

Grazie, funziona correttamente ora, io uso luaL_openlibs invece. Terrò a mente i tuoi consigli! – BoilingLime

+0

Aiuta. Potresti per favore approfondire perché luaopen_ * non funziona? È la prima cosa che vedi nella loro documentazione –

+0

@VladLazarenko Le funzioni luaopen_ * creano semplicemente una tabella (che contiene principalmente funzioni) in cima allo stack. Ciò che manca è associare quella tabella con un nome in modo che sia possibile accedervi da Lua e registrarlo con il meccanismo di caricamento del modulo. Questi due passaggi tuttavia sono uguali per tutte le biblioteche_. Pensa alla funzione luaopen_ * come a ciò che lo scrittore di librerie fornisce per impostare quella particolare libreria. Il suo obiettivo non è quello di eseguire il caricamento completo della libreria, ma piuttosto fornire le informazioni che luaL_requiref deve invece eseguire il caricamento. – ComicSansMS

Problemi correlati