3、C++程序读取Lua的Table——1
系列文章
Table是Lua里面特有的数据结构。要想在C语言中访问这种数据结构需要使用lua提供的一系列函数才行。其实,很简单,仅仅涉及到几个小函数。废话少说,上代码。
代码
LuaTable.lua
luat_Test={a=123, b=456,c=789}
LuaTable.cpp
#include <lua.hpp>
// 获取Table的Item
static void GetTableItem(lua_State *L, const char* lpszTableName, const char* lpszTableItem)
{
lua_getglobal(L, lpszTableName); // 获取Table
lua_pushstring(L, lpszTableItem); // 指定要得到的是哪个Item
lua_gettable(L, -2); // 获取Item的值,并将值压入栈里面
printf("%s.%s=%d\n", lpszTableName, lpszTableItem, (int)lua_tonumber(L, -1)); // 从栈里面得到值并打印
lua_pop(L, 2); // 将Item和Table从栈里面弹出
}
// 枚举Table中的Item
static void EnumTableItem(lua_State *L, const char* lpszTableName)
{
lua_getglobal(L, lpszTableName); // 获取Table
int it = lua_gettop(L); // 获取栈顶,此时Table肯定在栈顶
lua_pushnil(L); // ??
while(lua_next(L, it)) // 开始枚举,并把枚举到的值压入栈
{
printf("%d\n", (int)lua_tonumber(L, -1)); // 得到Item的值
lua_pop(L, 1); // 将Item从栈里面弹出
}
lua_pop(L, 1); // 将Table从栈里面弹出
}
int main (void)
{
lua_State *L = lua_open();
luaopen_base(L);
luaL_dofile(L, "LuaTable.lua");
GetTableItem(L, "luat_Test", "a");
GetTableItem(L, "luat_Test", "b");
GetTableItem(L, "luat_Test", "c");
EnumTableItem(L, "luat_Test");
lua_close(L);
return 0;
}
makefile
CFLAG=`pkg-config --cflags lua5.1`
LDFLAG=`pkg-config --libs lua5.1`
CC=g++
all: LuaTable
LuaTable : LuaTable.cpp
$(CC) -o $@ $(CFLAG) $(LDFLAG) $<
测试环境
类型 | 值 |
---|---|
操作系统 | Ubuntu 10.10 |
lua | 5.1.4 |