c++怎么得到lua传进来的数组(数组的大小不确定,不能以字符串形式压入栈)
比如:lua里面是:add={1,2,3,4,5,6....N}add.a={1,2}add.b={3,4}add.c={5,6}让c++能完整的得到整个表的值,并保存在...
比如: lua里面是:
add = {1,2,3,4,5,6....N}
add.a={1,2}
add.b={3,4}
add.c={5,6}
让c++能完整的得到整个表的值,并保存在一个数组里,但是add的长度不能确定, 展开
add = {1,2,3,4,5,6....N}
add.a={1,2}
add.b={3,4}
add.c={5,6}
让c++能完整的得到整个表的值,并保存在一个数组里,但是add的长度不能确定, 展开
3个回答
展开全部
楼上两个坑爹么那样回答...
首先我们要看一下我们要存储的对象
存储对象是一个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 = {1,2,3,4,{5,6,7},{{8},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 = {1,2,3,4,{5,6,7},{{8},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的表压入栈传给C++
C++有个函数能得到表的下标,直接while 取到NULL就停止。
展开全部
果然值100分,lua是什么我都不知道。。。
刚百度了一下,我觉得是在不行你可以试试找找看lua的存储方法,编程里的万事万物无非就是一堆指令和数据,既然你用lua已经算出来了数据,你可以试试了解一下它的数据存储方法,然后你用自己的方法读它的数据。
刚百度了一下,我觉得是在不行你可以试试找找看lua的存储方法,编程里的万事万物无非就是一堆指令和数据,既然你用lua已经算出来了数据,你可以试试了解一下它的数据存储方法,然后你用自己的方法读它的数据。
追问
lua与宿主交互就是通过栈来交互的,关键是C++如何得到lua的一个表中的所有值(哈希表)
追答
http://www.cppblog.com/mybios/archive/2006/11/18/15339.html
你看下这个文章,下边这段话
// 将一个 class 作为一个 Lua 对象是很容易的,只需要增加以下宏定义。
DEFINE_TYPENAME("My.array");
BEGIN_REGLUALIB("array")
LUALIB_ITEM_create("new", MyArray ) // 创建MyArray (注:由于发表的原因,create应为全部大写)
LUALIB_ITEM_DESTROY("del", MyArray ) // 消除MyArray。
END_REGLUALIB()
BEGIN_REGLUALIB_MEMBER()
LUALIB_ITEM_FUNC("size", int (MyArray*), &MyArray::size)
LUALIB_ITEM_FUNC("__getindex", double(MyArray*, int), &MyArray::getvalue)
LUALIB_ITEM_FUNC("__newindex", void (MyArray*, int, double), &MyArray::setvalue)
LUALIB_ITEM_FUNC("__tostring", const char* (MyArray*), &MyArray::ToString)
LUALIB_ITEM_DESTROY("__gc", MyArray ) // 垃圾收集时消除对象用。
END_REGLUALIB_MEMBER()
你可以试试在c++中先声明好一个类,然后在lua中计算,计算结果存储在你声明的这个类中,然后以这个类作为桥梁传递数据。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
分两步走,第一步,C语言如何把数据存到数据库?方法很多,可以考虑VC的库函数。 第二步,如何用宿主语言调用LUA?这方面的资料也不少,我感觉,用C把
追问
我是用lua写寻路算法,写好了,不知道怎么将他传进宿主,宿主又如何保存?
如果以字符串形式传入,效率灰常低
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询