Lua备忘

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值