2016-04-25 13 views
1

Ich schrieb eine einfache Lua-Funktion, die "C++" -Funktion verwendet, um auszuführen. Meine Absicht, eine 'C++' Funktion zu erstellen, besteht darin, dasselbe für alle lua Funktionen zu verwenden, um die 'C++' Variablen zu aktualisieren. Es funktioniert gut für Zahlen, aber wenn ich es für boolesche Werte versuchte, gibt es mir Ausnahme, wenn in Zeichenfolge konvertiert.Lua toString Ausnahme für booleschen Wert

Hier ist mein Code-Snippet.

C++ - Code.

#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; 
    } 
} 

Mein Lua Script:

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 

Dinge funktionieren mit dem obigen Code in Ordnung, aber wenn ich versuchte, den Sollwert zu ändern Boolesche Werte wie set_value ("RedLight", False) verwenden Ich bekomme Warnmeldungen gedruckt. Sollte ich False als Zeichenfolge übergeben?

+0

Was ist die Warnmeldung? Ist es die "WARNUNG: Ungültiges String-Argument/kann Arg # 2 in String" nicht konvertieren? Nachricht in Ihrem C++ Code oder etwas anderes? –

+0

@KeithThompson: Es ist in meinem C++ Code – kar

Antwort

2

Lua hat nicht False, so versucht es einfach global _G["False"] zu lesen, was natürlich nil ist.

Es hat false Schlüsselwort, aber es würde auch nicht funktionieren: lua_tostring funktioniert nur für Zahlen und Zeichenfolgen.

Wir sehen nicht setValueTo Code, so ist es schwer zu erraten, wie es funktioniert.

  • Wenn Sie wollen einfach bool Wert zu übergeben, verwenden lua_toboolean, aber bewusst sein, dass es 0 als true (im Allgemeinen als Lua) behandelt.
  • Wenn Sie "True" oder "False" als Strings übergeben wollen, dann ja, müssen Sie set_value("RedLight", "False")

Als Randbemerkung, betrachten how to implement lua_CFunction protocol Lesen schreiben. Wenn nun get_valuelightName nicht finden kann, wird als Ergebnis der letzte übergebene Parameter zurückgegeben.