int lua_gettop(lua_State *L)
void lua_settop(lua_State *L, int index) // lua_settop(L,0), 0清空栈
#define lua_pop(L,n) lua_settop(L,-(n)-1) // 可以从栈中弹出n个元素
void lua_pushvalue(lua_State *L, int index); // 将指定索引值的栈元素压入栈顶
void lua_remove(lua_State *L, int index); // 删除指定索引上的函数,并且将该索引位置的元素向下移以填补。
void lua_insert(lua_State *L, int index); // 上移指定位置上的所有元素
void lua_replace(lua_State *L, int index); // 弹出栈顶的值,并将该值设置到指定的索引上。
lua_settop(L, -1); // 将栈顶的元素设置为当前值
lua_insert(L,-1); // 将栈顶元素移动到栈底
// RunLua4.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <stdio.h>
extern "C"
{
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
};
#pragma comment(lib,"..\\lib\\lua51.lib")
// 遍历lua栈中的每个元素,从栈底开始遍历
static void TraverseLuaStack(lua_State* L)
{
int i;
int top = lua_gettop(L);
for(i=1;i<=top;i++)
{
int t = lua_type(L,i);
switch(t)
{
case LUA_TBOOLEAN:
{
printf("%s",lua_toboolean(L,i)?"true":"false");
}break;
case LUA_TSTRING:
{
printf("\'%s\'",lua_tostring(L,i));
}break;
case LUA_TNUMBER:
{
printf("%g",lua_tonumber(L,i));
}break;
case LUA_TNIL:
{
printf("nil");
}break;
default:
{
printf("other type:%d",t);
}break;
}
printf(" ");
}
printf("\n");
}
// 正数为栈底,负数为栈顶
int _tmain(int argc, _TCHAR* argv[])
{
lua_State *L = luaL_newstate();
lua_pushboolean(L,1); // 压入true
lua_pushnumber(L,10.2); // 压入10
lua_pushnil(L); // 压入nil
lua_pushstring(L,"Hello lua");// 压入Hello
/*
Hello // 栈顶
nil
10
true // 栈底
*/
TraverseLuaStack(L); // 从栈底开始遍历到栈顶
lua_pushvalue(L,-3); // 从栈顶开始的第3个位置的元素,放到栈顶
/*
10.2
Hello Lua
nil
10.2
true
*/
TraverseLuaStack(L); // 从栈底开始遍历到栈顶
lua_replace(L,3); // 弹出栈顶的值,并将该值设置到指定的索引上
/*
Hello Lua
10.2
10.2
true
*/
TraverseLuaStack(L); // 从栈底开始遍历到栈顶
lua_settop(L,6); /*
将栈顶设置为一个指定的位置,原来的
栈中只有4个元素, 将栈顶设置为6会向栈
中添加2个值为nil的元素。
nil
nil
Hello Lua
10.2
10.2
true
*/
TraverseLuaStack(L);
lua_remove(L,-3); // 删除指定索引上的元素
/*
nil
nil
10.2
10.2
true
*/
TraverseLuaStack(L); // 遍历栈
lua_close(L); // 关闭栈
return 0;
}