我写了一个简单的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
作为字符串传递?
答案 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
,则会返回最后传递的参数作为结果。