2013-05-06 7 views
5

私はlua fo AIを使用してプログラムを書くつもりです。 しかし、私は私のcppファイルからのluaスクリプトをロードしようとすると、私はこのエラーメッセージを持っている:ここでC++を使用したLuaスクリプト:グローバル 'io'(ゼロ値)のインデックスを作成しよう

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

は私のluaスクリプトです:

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

そして、ここでは私の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; 
    } 

ありがとうございます。

+0

コードは、実行するファイルごとに独立したLua状態を作成します。これにより、異なるファイルが通信できなくなります。これはあなたが望むものではないかもしれません。 – lhf

答えて

4

luaopen_ *関数を直接呼び出さないでください。 luaL_openlibsまたはその代わりにluaL_requirefのいずれかを使用します。

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

ここでは特に問題はluaopen_ioは、_Gionil値であるので、苦情をモジュールテーブルを格納していないということです。詳細について知りたい場合は、lauxlib.cのluaL_requirefのソースコードを見てください。

+0

ありがとう、今は正しく動作しますが、代わりにluaL_openlibsを使用します。私はあなたの助言に留意します! – BoilingLime

+0

助けてください。あなたはなぜluaopen_ *が動作しないのかを詳しく教えてください。これはドキュメントの中で最初に表示されるものです。 –

+0

@VladLazarenko luaopen_ *関数は、スタックの上にテーブル(関数を含む)を作成するだけです。欠落しているのは、そのテーブルを名前と関連付けることで、Lua内からアクセスしてモジュール読み込み機構に登録できるようにすることです。しかし、これら2つのステップはすべてのライブラリで同じです。 luaopen_ *関数は、ライブラリライターがその特定のライブラリを設定するために提供するものと考えてください。その目的は完全なライブラリの読み込みを行うのではなく、代わりに読み込みを実行するためにluaL_requirefが必要とする情報を提供することです。 – ComicSansMS

関連する問題