2016-03-18 9 views
1

おはよう、 私はLUA/C++アプリケーションに取り組んでいます。他のluaコードを再帰的に呼び出すにはluaが必要です。たとえば、C++はlua関数を呼び出し、lua関数は読み込まれた別の文字列から別のlua関数を呼び出します最初のlua関数の開始時に実行される登録済みのC関数を使用します。ここ Lua:2番目の文字列をロードした後にフィールドを取得できません。

は、私は、次の午前手順は次のとおりです。

lua_State* state = luaL_newstate(); 
    luaL_openlibs(state); 
    lua_register(state, "secondLua", secondLua); 
    lua_getfield(_luaState, LUA_GLOBALSINDEX, "init"); 
    lua_pcall(_luaState, 0, 0, 0); 

    int secondLua(lua_State* state){ 
    char* myString[128] = "function init2()\n io.write(\"hello\")\n end"; 
    luaL_loadstring(pLuaState, myString); 
    lua_getfield(pLuaState,LUA_GLOBALSINDEX, "init2"); // function init2 declared on myString 
    lua_pcall(pLuaState, 0, LUA_MULTRET, 0); 
//getting "attempt to call a nil value" here 

    return 0; 
    } 

すべてのヘルプは高く評価され、そして第二に、私は第二の機能に名前を付けることができる方法は、「初期化」などが存在するかどうかを知りたいです最初の1つ;

PS:私はC++ 14とlua 5.1をLUAJITで使用していますが、私はluaのdofileを使用できません。

+0

実際の問題とは関係ありませんが、[sol](https://github.com/ThePhD/sol2)などのラッパーライブラリを使用することを検討しましたか? – Borgleader

+0

なぜこのタグは '[c]'ですか? – 3442

+0

@KemyLandこれはLuaのためのC APIだと思います。 – Jakuje

答えて

2

lua_loadstring()は提供されたソースをコンパイルし、スタックにLuaチャンクを入れます。 init2()はそれを期待するときにまだ定義されていません。
実際にそのチャンクを実行し、新しいlua関数を定義するには、lua_loadstring()をluaL_dostring()に置き換えます。また、lua_loadstring()の直後にlua_pcall()を呼び出すこともできます。実際には、luaL_dostring()はlua_loadstring()の後にlua_pcall()を付けたものです。

関連する問題