Lua的函数有返回值的话,堆栈中不会清除,需要调用lua_settop(L, 0)
正数 1 指向顶
-1 指向低
最后返回的参数在低
若用顶获取返回值 lua_settop(L, 0)忘记调用会获取很早之前的遗留数据。
类似汇编语言push
// LuaTestDlg.cpp : 实现文件
//
#include "stdafx.h"
#include "LuaTest.h"
#include "LuaTestDlg.h"
#include "afxdialogex.h"
#include "lua.hpp"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// CLuaTestDlg 消息处理程序
lua_State *L;
int test2 = 0;
static int Test(lua_State* L)
{
lua_pushnumber(L, test2);//查找结果
test2++;
//返回值用于提示该C函数的返回值数量,即压入栈中的返回值数量。
return 1;
}
BOOL CLuaTestDlg::OnInitDialog()
{
L = luaL_newstate(); //必须要创建lua_State环境,stack存在于这个环境中
luaL_openlibs(L); //加载lua静态链接库lua5.1.lib
lua_register(L, "测试", Test);
....
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
int testcout = 0;
void CLuaTestDlg::OnBnClickedButton1()
{
lua_pushnumber(L, testcout);
testcout++;
// TODO: 在此添加控件通知处理程序代码
}
void CLuaTestDlg::OnBnClickedButton3()
{
// TODO: 在此添加控件通知处理程序代码
lua_settop(L, 0);
}
CLuaTestDlg* mthis;
void addText(CString& txt)
{
CString KK,KK2;
mthis->m_edit.GetWindowTextA(KK);
KK2 = KK+"\r\n" + txt;
mthis->m_edit.SetWindowTextA(KK2);
}
void stackDump(lua_State *L)
{
CString KK,KK2;
int i;
int top = lua_gettop(L); //获取stack大小
for (i = 1;i <= top;i++)
{
int type = lua_type(L, i);
switch (type)
{
case LUA_TSTRING:
{
KK.Format("%d:%s", i, lua_tostring(L, i));
addText(KK);
break;
}
case LUA_TBOOLEAN:
{
KK.Format(lua_toboolean(L, i) ? "true" : "false");
addText(KK);
break;
}
case LUA_TNUMBER:
{
KK.Format("%d:%g", i,lua_tonumber(L, i));
addText(KK);
break;
}
default:
{
KK.Format("%s", lua_typename(L, i));
addText(KK);
break;
}
}
KK.Format(" ");
addText(KK);
}
KK.Format("\n");
addText(KK);
}
void CLuaTestDlg::OnBnClickedButton2()
{
mthis = this;
CString k = "";
mthis->m_edit.SetWindowTextA(k);
stackDump(L);
// TODO: 在此添加控件通知处理程序代码
}
void CLuaTestDlg::OnBnClickedButton4()
{
// TODO: 在此添加控件通知处理程序代码
luaL_dofile(L,"./test.txt");
int xxxxxx= lua_tonumber(L, -1);
CString k = "";
k.Format("返回值:%d", xxxxxx);
m_edit.SetWindowTextA(k);
}
Test.txt
XX=测试()
return XX