Lua编程示例(五): C语言对Lua表的读取和添加
#include"stdafx.h"
lua_State*L;
voidload_lua(char*filename){
L=luaL_newstate();
luaL_openlibs(L);
if((luaL_loadfile(L,filename)||lua_pcall(L,0,0,0))!=0){
luaL_error(L,"loadfileerror!\n%s",lua_tostring(L,-1));
}
}
doublegetfield(lua_State*L,char*key){
doubleres;
//默认栈顶是table,将key入栈
lua_pushstring(L,key);
lua_gettable(L,-2);//查找键值为key的元素,置于栈顶
if(!lua_isnumber(L,-1)){
luaL_error(L,"numgeterror!%s\n",lua_tostring(L,-1));
}
res=lua_tonumber(L,-1);
lua_pop(L,1);//删掉产生的查找结果
returnres;
}
voidsetfield(lua_State*L,char*key,doublevalue){
//默认栈顶是table
lua_pushstring(L,key);
lua_pushnumber(L,value);
lua_settable(L,-3);//将这一对键值设成元素
}
structmycolor{
char*name;
unsignedcharred,green,blue;
}Color[]={
{"WIETH",1,1,1},
{"BLACK",0,0,0},
{"BLUE",0,0,1}
};
//先创建一个空的栈,填入元素,用lua_setglobal弹出表,并赋成全局变量
voidsetcolor(lua_State*L,structmycolorcol){
lua_newtable(L);
setfield(L,"r",col.red);
setfield(L,"g",col.green);
setfield(L,"b",col.blue);
lua_setglobal(L,col.name);
}
voidgetcolor(lua_State*L,char*key){
lua_getglobal(L,key);
if(!lua_istable(L,-1)){
luaL_error(L,"'background'isnotatable!%s\n",lua_tostring(L,-1));
}
doublered;
doublegreen;
doubleblue;
red=getfield(L,"r");
blue=getfield(L,"b");
green=getfield(L,"g");
printf("The%scolor:red=%.2f,green=%.2f,blue=%.2f\n",key,red,green,blue);
}
int_tmain(intargc,_TCHAR*argv[])
{
load_lua("test.lua");
getcolor(L,"background");
inti=0;
while(Color[i].name!=NULL){
setcolor(L,Color[i]);
i++;
}
getcolor(L,"WIETH");
getcolor(L,"BLUE");
return0;
}
test.lua中就一行代码:
background={r=1,g=0.5,b=0.7}
运行输出结果为:
Thebackgroundcolor:red=1.00,green=0.50,blue=0.70 TheWIETHcolor:red=1.00,green=1.00,blue=1.00 TheBLUEcolor:red=0.00,green=0.00,blue=1.00