lua中的lua_rawgeti和lua_rawseti函数用法

// gcc a.c -llua5.1

#include
#include
#include


int l_map(lua_State *L)
{
int i, n;

//第一个元素必须是table
luaL_checktype(L, 1, LUA_TTABLE);
//第二个元素必须为函数
luaL_checktype(L, 2, LUA_TFUNCTION);

//获取table的大小
n = lua_objlen(L, 1);


/*
* 从table中得到相应下标的元素
lua_rawgeti(L, index, key)
index表示table在栈中的位置
key表示元素在table中的位置
* */
/*
* 把值放到table相应下标位置
lua_rawseti(L, index, key)
index表示table在栈中的位置
key表示元素在table中的位置
* */


for (i = 1; i <= n; i++)
{
lua_pushvalue(L, 2);// 压入 f
lua_rawgeti(L, 1, i);//压入t[i]
lua_call(L, 1, 1);//调用f(t[i])
printf("lua data = %g\n", lua_tonumber(L, -1));
lua_rawseti(L, 1, i);// t[i] = 结果
}


printf("stack size = %d\n", lua_gettop(L));


for (int i = 1; i <= n; i++)
{
lua_rawgeti(L, 1, i);//压入t[i]
printf("lua data = %g\n", lua_tonumber(L, -1));
}


return 0;
}


int main()
{
lua_State *L = luaL_newstate();
luaL_openlibs(L);


lua_pushcfunction(L, l_map);
lua_setglobal(L, "map");


const char *fname = "a.lua";


luaL_loadfile(L, fname);
lua_pcall(L, 0, 0, 0);




lua_close(L);


return 0;

}

--a.lua



function  f(a)
return 2*a
end


tab = {1, 2, 3, 4, 5}


map(tab, f)

 

 

 

 

 

你可能感兴趣的:(c/c++小例子,Lua)