如何解析Lua中的table数据 20
最近在学习Lua脚本语言,基本的语法也都学了。但是在解析Lua脚本中的table数据时遇到了困难,请问各位:假设有Lua脚本如下localProject={};Proje...
最近在学习Lua脚本语言,基本的语法也都学了。
但是在解析Lua脚本中的table数据时遇到了困难,
请问各位:
假设有Lua脚本如下
local Project={};
Project.A={
one="helen",
...
...
}
Project.B={
....
}
1.请问如果我要在C语言中调用该Lua脚本,想要把Lua中的one这个数据解析出来,
该如何操作。具体调用哪些API。
注:解析Lua的全局变量和调用Lua函数并传递参数以及接收Lua函数的返回值这些我都
已经成功做到。只是这个table数据的解析我现在感到很难。
请给位大虾解答一下。谢谢。 展开
但是在解析Lua脚本中的table数据时遇到了困难,
请问各位:
假设有Lua脚本如下
local Project={};
Project.A={
one="helen",
...
...
}
Project.B={
....
}
1.请问如果我要在C语言中调用该Lua脚本,想要把Lua中的one这个数据解析出来,
该如何操作。具体调用哪些API。
注:解析Lua的全局变量和调用Lua函数并传递参数以及接收Lua函数的返回值这些我都
已经成功做到。只是这个table数据的解析我现在感到很难。
请给位大虾解答一下。谢谢。 展开
1个回答
展开全部
调用 GetLuaVar(luastate,"Project.A.one") 把Project.A.one的值取到堆栈上,
然后根据类型自己用 lua_tonumber(luastate, -1) 或 lua_tostring(luastate, -1)得数据
void GetLuaVar(lua_State* pLuaState,const char* strVarName)
{
const char* pIndS = strVarName;
const char* pIndE = strVarName;
T_B8 bParts = false;//判断是否分两部分,因为第一部分要用lua_getglobal,其他部分用lua_gettable
while( 0 != *pIndE )
{
if( '.' == *pIndE )
{
if(bParts)
{
lua_pushstring(pLuaState,std::string(pIndS,pIndE - pIndS).c_str());
lua_gettable(pLuaState,-2);
lua_remove(pLuaState,-2);
}
else
{
lua_getglobal(pLuaState,std::string(pIndS,pIndE - pIndS).c_str());
bParts = true;
}
++pIndE;
pIndS = pIndE;
}
else
{
++pIndE;
}
}
if(bParts)
{
lua_pushstring(pLuaState,std::string(pIndS,pIndE - pIndS).c_str());
lua_gettable(pLuaState,-2);
lua_remove(pLuaState,-2);
}
else
{
lua_getglobal(pLuaState,std::string(pIndS,pIndE - pIndS).c_str());
}
}
然后根据类型自己用 lua_tonumber(luastate, -1) 或 lua_tostring(luastate, -1)得数据
void GetLuaVar(lua_State* pLuaState,const char* strVarName)
{
const char* pIndS = strVarName;
const char* pIndE = strVarName;
T_B8 bParts = false;//判断是否分两部分,因为第一部分要用lua_getglobal,其他部分用lua_gettable
while( 0 != *pIndE )
{
if( '.' == *pIndE )
{
if(bParts)
{
lua_pushstring(pLuaState,std::string(pIndS,pIndE - pIndS).c_str());
lua_gettable(pLuaState,-2);
lua_remove(pLuaState,-2);
}
else
{
lua_getglobal(pLuaState,std::string(pIndS,pIndE - pIndS).c_str());
bParts = true;
}
++pIndE;
pIndS = pIndE;
}
else
{
++pIndE;
}
}
if(bParts)
{
lua_pushstring(pLuaState,std::string(pIndS,pIndE - pIndS).c_str());
lua_gettable(pLuaState,-2);
lua_remove(pLuaState,-2);
}
else
{
lua_getglobal(pLuaState,std::string(pIndS,pIndE - pIndS).c_str());
}
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询