Lua toString 异常用于布尔值
Lua toString exception for boolean value
我写了一个简单的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("红灯",False)时,我收到警告消息打印。我是否需要将False
作为字符串传递?
Lua没有False
,所以它只是尝试读取全局_G["False"]
这当然是nil
。
但是,它有false
关键字,但它也不起作用:lua_tostring
仅适用于数字和字符串。
我们看不到setValueTo
代码,因此很难猜测它是如何工作的。
- 如果您只想
bool
值传递给它,请使用lua_toboolean
,但请注意,它将0
视为true
(通常为 Lua)。 - 如果要将
"True"
或"False"
作为字符串传递,那么是的,您必须编写set_value("RedLight", "False")
作为旁注,请考虑阅读如何实现lua_CFunction协议。现在,如果get_value
找不到lightName
,它将返回最后传递的参数作为其结果。
相关文章:
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 变量定义到C++布尔值转换
- 如何确保在使用基于布尔值的两个方法之一调用方法时避免分支预测错误
- 不能将方法返回的值用于另一个方法
- 重载更少,则运算符返回相反的布尔值
- 将此布尔值传递给此函数的最有效方法是什么?
- 如何设置 c++ 类的布尔值?
- 使用 MAKEWORD / MAKEWPARAM 使用布尔值而不是布尔值
- 将 10 个线程与原子布尔值同步
- 创建类似于布尔值的变量类型
- 布尔值向量的基于范围 for 循环
- 零点和布尔值之间的比较
- 简化对两个布尔值的 4 个 if/else 检查
- 无法创建带有布尔值和矢量的地图
- 对于完成布尔值设置为 true 后未停止的循环
- 我无法将'2D array whit bool'转换为"空 2D 数组布尔值"(用于生命游戏)
- 专门用于布尔值的真假
- Lua toString 异常用于布尔值
- CRITICAL_SECTION用于设置和获取单个布尔值
- 哪个操作符重载被用于ifstream对象求值为布尔值