使用c 和c++调用lua脚本时,有时需要传入比较复杂的参数,所以先转化成table比较好:
c++代码:
好多代码都是连续很多语句压栈,但是有时候不确定长度的时候就显得很不好用,使用for循环就比较好。要注意的是,每次入栈key-value键值对,都需要将他们弹出放入table,如下:
#include <stdio.h>
#include<stdlib.h>
#include<stdint.h>
#include<iostream>
#include<string.h>
using namespace std;
extern "C"{
#include "lua.h"
#include "lauxlib.h"
#include "lualib.h"
}
int main()
{
lua_State * L=NULL;
/* 初始化 Lua */
// L = lua_open();
L =luaL_newstate();
/* 载入Lua基本库 */
luaL_openlibs(L);
/* 运行脚本 */
luaL_dofile(L, "func.lua");
for(int i=1;i<=4;i++){
lua_getglobal(L,"mytable");
lua_pushnumber(L, i); // 将要赋值的结果压入栈
lua_pushnumber(L, i+10); // 赋值操作 -->lua_rawseti用法
lua_settable(L, -3);
}
lua_getglobal(L,"structTest");
lua_pcall(L, 0, 0, 0);
lua_close(L);
return 1;
}
lua脚本:
mytable = {}
function structTest()
print("lua script func.lua have been load ")
for k, v in pairs(mytable) do
print("key: ".. k)
print("val: ".. v)
print()
end
end
结果:
key: 1
val: 11.0
key: 2
val: 12.0
key: 3
val: 13.0
key: 4
val: 14.0
c遍历table:
// 进行下面步骤前先将 table 压入栈顶
int nIndex = lua_gettop( pLua ); // 取 table 索引值
lua_pushnil( pLua ); // nil 入栈作为初始 key
while( 0 != lua_next( pLua, nIndex ) )
{
// 现在栈顶(-1)是 value,-2 位置是对应的 key
// 这里可以判断 key 是什么并且对 value 进行各种处理
lua_pop( pLua, 1 ); // 弹出 value,让 key 留在栈顶
}
// 现在栈顶是 table