C语言和Lua交互(四)

    xiaoxiao2021-03-25  107

    C语言创建lua table变量(table赋值)

    直接上代码

    #include <stdio.h> #include <string.h> #include "lua.h" #include "lauxlib.h" #include "lualib.h" lua_State *L = NULL; /*获取table对应key的值, 假设table位于栈顶*/ int getfield(lua_State *L,const char *key){ int result; //lua_pushstring(L,key);//background位于栈顶, 把key压入栈后,background索引变为-2 //lua_gettable(L,-2);//获取background[key] //和以下一句话等价 lua_getfield(L,-1,key); if(!lua_isnumber(L,-1)){ error(L,"invalid component in background color"); } result = (int)lua_tonumber(L,-1);//保存获取到的数据 lua_pop(L,1);//删除栈 return result; } //设置table字段值 void setfield(lua_State *L,const char *index,int value){ lua_pushnumber(L,(int)value); lua_setfield(L,-2,index);//table在栈顶,所以是-2 } //table赋值应用 void setcolor(lua_State *L,char *name,int r,int g,int b){ lua_newtable(L);//创建一个空的table,压入栈顶-1 setfield(L,"r",r); setfield(L,"g",g); setfield(L,"b",b); lua_setglobal(L,name);//赋予全局变量 } static void loadConfig(char *name,int *r,int *g,int *b){ //读取全局变量name lua_getglobal(L,name);//把table压入栈 if(!lua_istable(L,-1)){ error(L,"background should be a table \n"); } *r=getfield(L,"r");//获取table的值 *g=getfield(L,"g"); *b=getfield(L,"b"); } int main(void){ L = luaL_newstate(); //打开Lua,创建一个新环境(新的Lua状态) luaL_openlibs(L); //打开标准库, 如: print, pcall setcolor(L,"background",200,188,66);//创建一个新table并赋值全局变量 int red=0; int green=0; int blue=0; loadConfig("background",&red,&green,&blue);//从lua文件中加载配置 printf("red:%d,green:%d,blue:%d",red,green,blue); lua_close(L);//关闭lua状态 return 0; }

    编译代码:

    gcc -lm -g -o test test.c /usr/local/lib/liblua.a -ldl

    和上一节唯一不同的是:

    setcolor(L,"background",200,188,66);//创建一个新table并赋值全局变量

    直接使用C语言创建table,设置相关的值,并赋值全局变量。 具体调用了以下几个API:

    void lua_newtable (lua_State *L);//创建一张空表,并将其压栈。 它等价于 lua_createtable(L, 0, 0) 。 void lua_setglobal (lua_State *L, const char *name);//从堆栈上弹出一个值,并将其设为全局变量 name 的新值。 void lua_setfield (lua_State *L, int index, const char *k);//做一个等价于 t[k] = v 的操作, 这里 t 是给出的索引处的值, 而 v 是栈顶的那个值。 这个函数将把这个值弹出栈。
    转载请注明原文地址: https://ju.6miu.com/read-21395.html

    最新回复(0)