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