请问一下C++怎样保存lua中的表,再利用
tb1={}tb1.__index=tb1functiontb1.create()localtemp={}setmetatable(temp,tb1)returntemp...
tb1 = {}
tb1 .__index = tb1
function tb1.create()
local temp = {}
setmetatable(temp, tb1)
return temp
end
function tb1.test()
print("success")
end
我想在C++里执行tb1.create 然后返回的一个新表
用 lua_State * L = lua_topointer() 取的返回结果。
我怎么样才能调用得到 上面的tb1.test函数?
谢谢 展开
tb1 .__index = tb1
function tb1.create()
local temp = {}
setmetatable(temp, tb1)
return temp
end
function tb1.test()
print("success")
end
我想在C++里执行tb1.create 然后返回的一个新表
用 lua_State * L = lua_topointer() 取的返回结果。
我怎么样才能调用得到 上面的tb1.test函数?
谢谢 展开
3个回答
展开全部
c++里没有table类型
所以 你只能选择 1 尽量把操作放在lua里执行 2 构造一个类似于table类型的变量
但是自己构造table的话 功能上肯定会有很大的差距
因为lua的table可以储存任何类型的变量 然而在C C++里实现的数组或是vector或是其他类型的存储结构存储的类型总是规定好,没办法像lua里那样灵活多变
如果只是想调用函数的话
先把表tb1放到堆栈里,取出tb1以test为下标的值
然后用lua_pcall 就能调用了
再就是
楼上那位 你复制的那个代码... 好巧 是我写的 呵呵
都7级了 好歹弄点原创吧 整天复制别人的多没意思 不是么
再就是 如果你要复制别人的帖子的话 你也全复制吧,这样别人也会有点参考价值
原帖 http://zhidao.baidu.com/question/266442306.html?an=0&si=8
这个帖子是处理嵌套结构的table而不是处理c++里table的存储 唉..
所以 你只能选择 1 尽量把操作放在lua里执行 2 构造一个类似于table类型的变量
但是自己构造table的话 功能上肯定会有很大的差距
因为lua的table可以储存任何类型的变量 然而在C C++里实现的数组或是vector或是其他类型的存储结构存储的类型总是规定好,没办法像lua里那样灵活多变
如果只是想调用函数的话
先把表tb1放到堆栈里,取出tb1以test为下标的值
然后用lua_pcall 就能调用了
再就是
楼上那位 你复制的那个代码... 好巧 是我写的 呵呵
都7级了 好歹弄点原创吧 整天复制别人的多没意思 不是么
再就是 如果你要复制别人的帖子的话 你也全复制吧,这样别人也会有点参考价值
原帖 http://zhidao.baidu.com/question/266442306.html?an=0&si=8
这个帖子是处理嵌套结构的table而不是处理c++里table的存储 唉..
展开全部
楼上两个坑爹么那样回答...
首先我们要看一下我们要存储的对象
存储对象是一个lua的table结构
table结构在lua里可以看作是一种动态的数组
然而在lua里的table和C里的数组差别比较大,我们并不能直接把表简单的传过去,所以我们要把table转化成一个c里可以存储的方式,因此我们需要遍历一下lua里的表
下面是大概的思路 具体的代码你需要自己去写
namelist = {} --这个用来存储遍历后展开的表的索引
valuelist = {} --这个用来存储遍历后展开的每一个值
typelist = {} --用来保存变量的类型
function saveTable(t,parent)
parent = parent or ""
for i,v in pairs(t) do
table.insert(namelist,i.."#"..parent) --将名字存入名字列表
table.insert(typelist,type(v)) --将对应变量的类型存入列表
table.insert(valuelist,v) --将变量存入列表
if type(v) == "table" then
saveTable(v,tostring(i).."#"..parent)
end
end
end
这里就可以将一个完整的表拆成索引 对应值 以及类型 存到3个表里
然后将3个表 传给C,然后再由C把这个表重新组装起来
测试的话 这样
test = ,,9}}
saveTable(test)
for i,v in pairs(namelist) do
print(v)
end
for i,v in pairs(valuelist) do
print(v)
end
for i,v in pairs(typelist) do
print(v)
end
就可以看到3个表的内部结构,然后C的话 只要通过类型判断处理方法,是表的话就再建个数组
然后索引按照namelist里进行按层拆分就可以获得了
首先我们要看一下我们要存储的对象
存储对象是一个lua的table结构
table结构在lua里可以看作是一种动态的数组
然而在lua里的table和C里的数组差别比较大,我们并不能直接把表简单的传过去,所以我们要把table转化成一个c里可以存储的方式,因此我们需要遍历一下lua里的表
下面是大概的思路 具体的代码你需要自己去写
namelist = {} --这个用来存储遍历后展开的表的索引
valuelist = {} --这个用来存储遍历后展开的每一个值
typelist = {} --用来保存变量的类型
function saveTable(t,parent)
parent = parent or ""
for i,v in pairs(t) do
table.insert(namelist,i.."#"..parent) --将名字存入名字列表
table.insert(typelist,type(v)) --将对应变量的类型存入列表
table.insert(valuelist,v) --将变量存入列表
if type(v) == "table" then
saveTable(v,tostring(i).."#"..parent)
end
end
end
这里就可以将一个完整的表拆成索引 对应值 以及类型 存到3个表里
然后将3个表 传给C,然后再由C把这个表重新组装起来
测试的话 这样
test = ,,9}}
saveTable(test)
for i,v in pairs(namelist) do
print(v)
end
for i,v in pairs(valuelist) do
print(v)
end
for i,v in pairs(typelist) do
print(v)
end
就可以看到3个表的内部结构,然后C的话 只要通过类型判断处理方法,是表的话就再建个数组
然后索引按照namelist里进行按层拆分就可以获得了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
代码:
#include "stdafx.h"
#include "stdio.h"
extern "C"
{
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
};
#pragma comment(lib,"lua5.1.lib")
void stackDump(lua_State *L)
{
int i;
int top = lua_gettop(L);
printf("the size of stack is:%d\n",top);
for ( i = 1;i <= top;i++ )
{
int type = lua_type(L, i);
switch(type)
{
case LUA_TSTRING:
{
printf("%s",lua_tostring(L, i));
break;
}
case LUA_TBOOLEAN:
{
printf(lua_toboolean(L, i)?"true":"false");
break;
}
case LUA_TNUMBER:
{
printf("%g",lua_tonumber(L, i));
break;
}
case LUA_TTABLE:
{
printf("this is a table!");
break;
}
default:
{
printf("%s",lua_typename(L ,i));
break;
}
}
printf(" ");
}
printf("\n");
}
//获取lua文件中类型为表的变量
void loadConfigTable(lua_State *L,const char *fname, int *w, int *h)
{
if ( luaL_loadfile(L, fname) || lua_pcall(L,0,0,0) )
printf("error,can't run config file:%s:",lua_tostring(L,-1));
stackDump(L);
lua_getglobal(L, "color"); //获取lua文件中的表color,压入栈顶
if ( !lua_istable(L, -1) )
printf("error,color is not a table");
stackDump(L);
lua_getfield(L, -1, "red"); //获取color表中key为red的value。获取前color表位于栈顶
if ( !lua_isnumber(L,-1) )
printf("error,color type is not a number");
stackDump(L);
*w = lua_tointeger(L, -1);
lua_pop(L, 1); //从栈中弹出一个元素,即弹出栈顶值
lua_getfield(L, -1, "white");
if ( !lua_isnumber(L, -1) )
printf("error,color type is not a number");
stackDump(L);
*h = lua_tointeger(L, -1);
}
int _tmain(int argc, _TCHAR* argv[])
{
lua_State *L;
L = luaL_newstate();
luaL_openlibs(L);
int i = 0;
int j = 0;
loadConfigTable(L, "configTable.lua", &i, &j);
printf("the value of i,j is %d,%d",i,j);
return 0;
}
#include "stdafx.h"
#include "stdio.h"
extern "C"
{
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
};
#pragma comment(lib,"lua5.1.lib")
void stackDump(lua_State *L)
{
int i;
int top = lua_gettop(L);
printf("the size of stack is:%d\n",top);
for ( i = 1;i <= top;i++ )
{
int type = lua_type(L, i);
switch(type)
{
case LUA_TSTRING:
{
printf("%s",lua_tostring(L, i));
break;
}
case LUA_TBOOLEAN:
{
printf(lua_toboolean(L, i)?"true":"false");
break;
}
case LUA_TNUMBER:
{
printf("%g",lua_tonumber(L, i));
break;
}
case LUA_TTABLE:
{
printf("this is a table!");
break;
}
default:
{
printf("%s",lua_typename(L ,i));
break;
}
}
printf(" ");
}
printf("\n");
}
//获取lua文件中类型为表的变量
void loadConfigTable(lua_State *L,const char *fname, int *w, int *h)
{
if ( luaL_loadfile(L, fname) || lua_pcall(L,0,0,0) )
printf("error,can't run config file:%s:",lua_tostring(L,-1));
stackDump(L);
lua_getglobal(L, "color"); //获取lua文件中的表color,压入栈顶
if ( !lua_istable(L, -1) )
printf("error,color is not a table");
stackDump(L);
lua_getfield(L, -1, "red"); //获取color表中key为red的value。获取前color表位于栈顶
if ( !lua_isnumber(L,-1) )
printf("error,color type is not a number");
stackDump(L);
*w = lua_tointeger(L, -1);
lua_pop(L, 1); //从栈中弹出一个元素,即弹出栈顶值
lua_getfield(L, -1, "white");
if ( !lua_isnumber(L, -1) )
printf("error,color type is not a number");
stackDump(L);
*h = lua_tointeger(L, -1);
}
int _tmain(int argc, _TCHAR* argv[])
{
lua_State *L;
L = luaL_newstate();
luaL_openlibs(L);
int i = 0;
int j = 0;
loadConfigTable(L, "configTable.lua", &i, &j);
printf("the value of i,j is %d,%d",i,j);
return 0;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询