Lua笔记
注册c函数 一般我们用 luaL_register,比如lua_register(L,?"testfunc",?testf); 其中testf就是c函数,这样lua就可以调用了 我们还可以批量注册函数 static luaL_Reg mylibs[] = { {"add",add}, {sub {NULL,NULL} }; luaL_register(L,"mylib",mylibs); 这样在lua里面就可以调用,注意调用的时候要加上名字,比如 mylib.add
栈操作相关函数 ?1). 压入元素:lua_push* ? ? void lua_pushnumber(lua_State* L,lua_Number n);?--浮点数 ? ??
? ? 查询和转换函数都不会将元素从堆栈里面抛出
? ?4)其它函数
? ?lua_getglobal(lua_State* L,char* name) 从lua的全局表里面取出名字为name的值,这个函数其实是一个宏定义,#define lua_getglobal(L,s)
lua_getfield(L,LUA_GLOBALSINDEX,(s)),c++先把name压栈,然后lua从栈中抛出这个name,取值压栈,就是说调用之后是name对应的值在栈顶,需要我们通过lua_to*函数取出来
?lua_setglobal则是设置lua中的全局变量值
? ? int lua_gettop(lua_State* L);?--返回栈中元素的个数。
?? ?void lua_settop(lua_State* L,int index);?--将栈顶设置为指定的索引值。 ?? ?void lua_pushvalue(lua_State* L,0)">--将指定索引的元素副本压入栈。 ?? ?void lua_remove(lua_State* L,0)">--删除指定索引上的元素,其上面的元素自动下移。 ?? ?void lua_insert(lua_State* L,0)">--将栈顶元素插入到该索引值指向的位置。 ?? ?void lua_replace(lua_State* L,0)">--弹出栈顶元素,并将该值设置到指定索引上。 ? ? ?lua_pop(L,n) 抛出栈顶的n个元素 5)通过堆栈对表的操作 ??void lua_getfield(lua_State *L,int idx,const char *k); 第二个参数是table变量在栈中的索引值,最后一个参数是table的键值,该函数执行成功后会将字段值压入栈中。 ? ? 读取表,先通过lua_getglobal得到表,然后获取表里面的元素比如lua里面有一张表 tbtest = { mem1=5,mem2=7.9} ? ?lua_getglobal(L,"tbltest"); //这时候tbltest已经放在栈顶了 ? lua_getfield(L,-1,"mem1");// 这样就把 mem1的值放入到栈顶了 ? int nmem1 = lua_tointeger(L,-1); ? lua_pop(L,1); //这样tbltest又回到栈顶了 ? double dbmem2 = lua_tonumber(L,-1); ?? 表的操作 1.? 建一个新表 void lua_createtable (lua_State *L,int narr,int nrec) 创建一个新的table,并把它放在栈顶. narr和nrec分别指定该table的array部分和hash部分的预分配元素数量 无返回值 栈高度+1,栈顶元素是新table #define lua_newtable(L) lua_createtable(L,0) 常用这个 ? 2. 取表中的元素 void lua_getfield (lua_State *L,int index,const char *k) 操作: arr = Stack[index] // arr肯定是表 Stack.push( arr[k] ) 取表中键为k的元素,这里的表是由index指向的栈上的一个表 注意,该操作将触发 __index 元方法 3. 给表中的元素赋值 void lua_setfield (lua_State *L,242)">操作: arr = Stack[index] arr[k] = Stack.top() Stack.pop() 给表中键为k的元素赋值value(value就是栈顶元素),242)">栈高度-1,被弹出的是value 4. 取表元素 和 表元素赋值 void lua_gettable (lua_State *L,int index) 操作:???? ele? = Stack[index] ??????????? key = Stack.top() ??????????? Stack.pop() ??????????? value = ele[key] ??????????? Stack.push(value) 根据index指定取到相应的表; 取栈顶元素为key,并弹出栈; 获取表中key的值压入栈顶. 无返回值 栈高度不变,但是发生了一次弹出和压入的操作,弹出的是key,压入的是value 注意,该操作将触发 __index 元方法 ? void lua_settable (lua_State *L,int index) 操作: ele = Stack[index] value = Stack.top() key = Stack.top() ele[key] = value 根据index指定取到相应的表; 取栈顶元素做value,弹出之; 再取当前栈顶元素做key,亦弹出之; 然后将表的键为key的元素赋值为value 栈高度-2,第一次弹出value,第二次弹出key 5. 对table的一些操作[不引发原方法] void lua_rawget (lua_State *L,242)"> 和lua_gettable操作一样 ??????? value = Stack.top() ??????? Stack.pop() ??????? ele[n] = value 栈-1,栈顶将value弹出 ? 6. 复制栈上元素并压入栈 void lua_pushvalue (lua_State *L,242)"> 操作:?? value = Stack[index]??????? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |