使用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