布尔值的Lua toString异常

时间:2016-04-25 20:04:58

标签: c++ lua

我写了一个简单的lua函数,它使用'C ++'函数来执行。因为我创建'C ++'函数的目的是在所有lua函数中使用相同的函数来更新'C ++'变量。它适用于数字,但是当我尝试使用布尔值时,它在转换为字符串时会给我异常。

这是我的代码段。

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(“RedLight”,False)时,我会收到警告消息打印。我是否需要将False作为字符串传递?

1 个答案:

答案 0 :(得分:2)

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

但它有false个关键字,但它也不起作用:lua_tostring仅适用于数字和字符串。

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

  • 如果您只想将bool值传递给它,请使用lua_toboolean,但请注意,它会将0视为true(一般为Lua)。< / LI>
  • 如果您想将"True""False"作为字符串传递,那么是的,您必须写set_value("RedLight", "False")

作为旁注,请考虑阅读how to implement lua_CFunction protocol。现在,如果get_value无法找到lightName,则会返回最后传递的参数作为结果。