2016-04-25 29 views
1

我写了一个简单的使用'C++'函数执行的lua函数。因为我创建'C++'函数的目的是在所有lua函数中使用相同的函数来更新'C++'变量。它适用于数字,但是当我尝试使用布尔值时,它在转换为字符串时会给我例外。Lua 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)我收到警告消息打印。我需要通过False作为字符串吗?

+0

什么是警告信息?它是''警告:无效的字符串参数/无法将您的C++代码或其他内容中的参数#2转换为字符串“消息? –

+0

@KeithThompson:它在我的C++代码中 – kar

回答

2

Lua没有False,所以它只是试图读取全球_G["False"],当然这是nil

它有false关键字,但是,它也不会工作:lua_tostring只适用于数字和字符串。

我们没有看到setValueTo代码,所以很难猜测它是如何工作的。

  • 如果你只是想bool值传递给它,使用lua_toboolean,但要知道,它把0true(如Lua中一般)。
  • 如果你想通过"True""False"为字符串,然后是,你必须写set_value("RedLight", "False")

作为一个侧面说明,可以阅读how to implement lua_CFunction protocol。现在,如果get_value找不到lightName,它将返回最后传递的参数作为其结果。