【问题标题】:Lua toString exception for boolean value布尔值的 Lua toString 异常
【发布时间】:2016-04-25 20:04:57
【问题描述】:

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

这是我的代码 sn-p。

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 作为字符串传递?

【问题讨论】:

  • 警告信息是什么?是 C++ 代码中的 "WARNING : Invalid String Argument / Cannot convert arg#2 to string" 消息还是其他内容?
  • @KeithThompson:在我的 C++ 代码中

标签: c++ lua


【解决方案1】:

Lua 没有False,所以它只是尝试读取全局_G["False"],当然是nil。

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

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

  • 如果您只是想将bool 值传递给它,请使用lua_toboolean,但请注意它将0 视为true(通常与Lua 相同)。
  • 如果你想将"True"或"False"作为字符串传递,那么是的,你必须写set_value("RedLight", "False")

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

【讨论】:

    猜你喜欢
    • 2016-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多