gpt4 book ai didi

c++ - bool 值的 Lua toString 异常

转载 作者:行者123 更新时间:2023-11-30 03:42:23 25 4
gpt4 key购买 nike

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

这是我的代码片段。

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

上面的代码一切正常,但是当我尝试更改设置值以使用 bool 值时,如 set_value("RedLight", False) 我收到警告消息打印。我是否需要将 False 作为字符串传递?

最佳答案

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,它将返回最后传递的参数作为结果。

关于c++ - bool 值的 Lua toString 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36850047/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com