C++操作lua栈

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;
}






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值