extern "C"
{
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
}
lua栈相关操作函数
学习目标:
了解lua栈相关操作
lua_pushnumber //#define LUA_NUMBER double
lua_pushinteger//long long //dword
lua_pop //从栈顶弹出N个元素 改变栈顶指针地址
lua_tonumber //取栈里的元素 转换成double类型返回 用%f
lua_tointeger //转成整数 用%d
lua 使用一个虚拟栈来和c传递值.栈上的每个元素都是一个 lua 值(nil,数字,字符串,等等).
无论何时 在lua中被调用的函数都得到一个新的栈,这个栈独立于c函数本身的堆栈 也独立于以前的栈
(注释:在c函数里,用lua api 不能访问到lua 状态机中本次调用之外的堆栈中的数据) 它里面包含了 lua
传递给c函数的所有参数,而 c 函数则把要返回的结果也放入堆栈以返回给调用者
方便起见,所有针对栈的 api 查询操作都不严格遵循栈的操作规则 .而是可以用一个索引来指向栈上的任何元素
正的索引值的是栈上是绝对位置(从一开始); 负的索引则指从栈顶开始的偏移量.
每个call函数 都有一个独立栈
负数:栈顶
正数:栈底开始编号
lua_pop(L,2) 弹出2个元素
lua_pushinteger(L, 1);//栈底 1
lua_pushinteger(L, 2);
lua_pushinteger(L, 3);
lua_pushinteger(L, 4);
lua_pushinteger(L, 5);//栈顶 -1
printf("%f\n", lua_tonumber(L, -1));
lua_pushinteger(L, 1);
lua_pushinteger(L, 2);
lua_pushinteger(L, 3);
lua_pushinteger(L, 4);
lua_pushinteger(L, 5);
lua_pop(L, 2);//从栈顶出栈
printf("%d\n", lua_tointeger(L, 1));
#include "stdafx.h"
#include"process.h"
extern "C"
{
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
}
extern "C" int caozuozhan_lua(lua_State*L)
{
lua_pushinteger(L, 1);//栈底 1
lua_pushinteger(L, 2);
lua_pushinteger(L, 3);
lua_pushinteger(L, 4);
lua_pushinteger(L, 5);//栈顶 -1
//printf("%f\n", lua_tonumber(L, -1));
//lua_pushnumber(L, 1);
//lua_pushnumber(L, 2);
//lua_pushnumber(L, 3);
//lua_pushnumber(L, 4);
//lua_pushnumber(L, 5);
lua_pop(L, 2);//从栈顶出栈
printf("%d\n", lua_tointeger(L, -1));
return 1;
}
int main()
{
lua_State*L = luaL_newstate();
luaL_openlibs(L);
lua_register(L, "caozuozhan", caozuozhan_lua);
luaL_dostring(L, "caozuozhan()");
//luaL_dofile(L, "lisaisai.txt");
lua_close(L);
system("pause");
return 0;
}