2016-04-25 4 views
1

実行するために 'C++'関数を使用する単純なlua関数を記述しました。 'C++'関数を作成する私の意図は、すべてのlua関数で同じものを使って 'C++'変数を更新することです。数値に対しては問題なく動作しますが、ブール値で試してみると、文字列に変換するときに例外が発生します。ブール値のルアtoString例外

ここに私のコードスニペットがあります。

C++コード。

#include <lua.hpp> 
/* the Lua interpreter */ 
lua_State *luaState; 
std::map<lua_State *, CLuaTest *> luaFbtlookup; 

void CLuaTest::CLuaTest() { 
    // initialize Lua 
    luaState = luaL_newstate(); 
    lua_register(luaState, "get_value", get_value); // func to get values 
    lua_register(luaState, "set_value", set_value); // func to set values 
    // load Lua base libraries 
    luaL_openlibs(luaState); 
    luaL_dofile(luaState, "C:\LuaTest.lua"); 
    luaFbtlookup.insert(make_pair(luaState, this)); 
} 

int get_value(lua_State *L); 
int set_value(lua_State *L); 

extern "C++" int get_value(lua_State *L) 
{ 
    string lightName = lua_tostring(L, 1); 
    FbTLuaLookup::iterator iter = luaFbtlookup.find(L); 
    if (iter != luaFbtlookup.end()) { 
     lua_pushstring(L, iter->second->getValueFrom(lightName).c_str()); 
     return 1; // do not return zero 
    } 
    return 1; 
} 

extern "C++" int set_value(lua_State *L) 
{ 
    string lightName = lua_tostring(L, 1); 
    if (NULL == lua_tostring(L, 2)) 
    { 
     printf("WARNING : Invalid String Argument/Cannot convert arg#2 to string"); 
    } 
    else { 
     string value = lua_tostring(L, 2); 

     FbTLuaLookup::iterator iter = luaFbtlookup.find(L); 
     if (iter != luaFbtlookup.end()) { 
      iter->second->setValueTo(lightName, value); 
      lua_pushnumber(L, true); 
      return 1; // do not return zero 
     } 
    } 
    return 1; 
} 

CLuaTest::ExecuteScript(enum Seq) { 
    switch(Seq) { 
    case 0: 
     lua_getglobal(luaState, "AllLightsOff"); 
    break; 

    case 1: 
     lua_getglobal(luaState, "RedLightOn"); 
    break; 

    case 2: 
     lua_getglobal(luaState, "AmberLightOn"); 
    break; 

    case 3: 
    lua_getglobal(luaState, "GreenLightOn"); 
    break; 
    } 
} 

私のluaスクリプト:

function AllLightsOff 
    set_value("RedLight", 0) 
    set_value("AmberLight",0) 
    set_value("GrenLight",0) 
end 

function RedLightOn 
    set_value("RedLight", 1) 
    set_value("AmberLight",0) 
    set_value("GrenLight",0) 
end 

function AmberLightOn 
    set_value("RedLight", 0) 
    set_value("AmberLight",1) 
    set_value("GrenLight",0) 
end 

function GreenLightOn 
    set_value("RedLight", 0) 
    set_value("AmberLight",0) 
    set_value("GrenLight",1) 
end 

物事は上記のコードで正常に動作が、私はSET_VALUE(「レッドライト」、偽)のようなブール値を使用して、設定値を変更しようとしたとき私は警告メッセージの印刷を取得します。文字列としてFalseを渡す必要がありますか?

+0

警告メッセージとは何ですか? ''警告:無効な文字列引数/あなたのC++コードなどでarg#2を文字列 ''のメッセージに変換できませんか? –

+0

@KeithThompson:これは私のC++コードです – kar

答えて

2

ルアにはFalseが含まれていないので、グローバル_G["False"]はもちろんnilです。

キーワードはfalseですが、どちらでも動作しません。lua_tostringは数字と文字列だけで動作します。

setValueToコードは表示されないため、どのように動作するのかを推測するのは難しいです。

  • あなたは、単に、それにbool値を渡すlua_tobooleanを使用しますが、それは(一般的にはLuaのよう)trueとして0を扱うことに注意してください。
  • あなたは文字列として"True"または"False"を渡したい場合は、[はい、あなたはhow to implement lua_CFunction protocolを読んでみて、注意点としてset_value("RedLight", "False")

を記述する必要があります。現在、get_valuelightNameを見つけられない場合、結果として最後に渡されたパラメータが返されます。

関連する問題