C++ Lua 交互练习!!!!!!!!

// text.cpp : Defines the entry point for the console application.
//
#include <iostream>
#include <fstream>
#include <string>
using namespace std;

extern "C"
{
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
}
#pragma comment(lib,"lualib.lib")
lua_State * L;
LUALIB_API int textC(lua_State *L)
{
    if(L == nullptr)
    {
        return 0;
    }
    cout<<"This msg from C++"<<endl;
    return 0;
}
LUALIB_API int textC1(lua_State *L)
{
    if(L == nullptr)
    {
        return 0;
    }
    int ax = luaL_checkint(L,-2);
    int bx = luaL_checkint(L,-1);
    cout<<"This msg from C++ ax="<<ax<<"  bx="<<bx<<endl;
    lua_pushnumber(L,ax-1);
    lua_pushnumber(L,bx-1);
    return 2;
}
void text1()
{
    //----------------------------------------------------------------
    cout<<"LUA调用C++函数,带参数"<<endl;
    lua_pushcfunction(L,textC1);
    lua_setglobal(L,"textC1");
    char* str = "E:\\A.lua";
    if (luaL_loadfile(L,str)|| lua_pcall(L,0,0,0))
    {
        const char* error = lua_tostring(L,-1);
        cout<< string(error)<<endl;
        return;
    }
}
void text()
{
//----------------------------------------------------------------
    cout<<"LUA调用C++函数"<<endl;
    lua_pushcfunction(L,textC);
    lua_setglobal(L,"textC");

//----------------------------------------------------------------
    char* str = "E:\\A.lua";
    if (luaL_loadfile(L,str)|| lua_pcall(L,0,0,0))
    {
        const char* error = lua_tostring(L,-1);
        cout<< string(error)<<endl;
        return;
    }
    cout<<"读取LUA中值"<<endl;
    int a = 0;
    int b = 0;
    lua_getglobal(L,"a");
    if (!lua_isnumber(L, -1))
    {
        cout << "-2 error" << lua_isnumber(L, -1) << lua_isnumber(L, -1) << endl;
        return ;
    }
    a = lua_tonumber(L,-1);
    lua_getglobal(L,"b");
    if (!lua_isnumber(L, -1))
    {
        cout << "-2 error" << lua_isnumber(L, -1) << lua_isnumber(L, -1) << endl;
        return ;
    }
    b = lua_tonumber(L,-1);
    cout<<a<<endl;
    cout<<b<<endl;

//------------------------------------------------------------------
    cout<<"读取Table中值"<<endl;
    lua_getglobal(L,"table");
    lua_pushstring(L,"a");
    lua_gettable(L,-2);    //取Table 命令 压入 -2位置
    if(lua_isnumber(L,-1))
    {
        cout<<"table.a = "<<lua_tonumber(L,-1)<<endl;
    }

//----------------------------------------------------------------
    cout<<"调取LUA中函数"<<endl;
    lua_getglobal(L,"textlua");
    if(!lua_isfunction(L,-1))
    {
        const char* error = lua_tostring(L,-1);
        cout<<string(error)<<endl;
    }
    if(lua_pcall(L,0,0,0))
    {
        const char* error = lua_tostring(L,-1);
        return;
    }

//----------------------------------------------------------------
    cout<<"传一个参数"<<endl;
    lua_getglobal(L,"textlua1");
    if(!lua_isfunction(L,-1))
    {
        const char* error = lua_tostring(L,-1);
        cout<<string(error)<<endl;
    }
    lua_pushstring(L,"111");
    if(lua_pcall(L,1,0,0))
    {
        const char* error = lua_tostring(L,-1);
        cout<<string(error)<<endl;
        return;
    }

//----------------------------------------------------------------
    cout<<"传一个参数,得到两个返回值"<<endl;
        lua_getglobal(L,"textlua1");
    if(!lua_isfunction(L,-1))
    {
        const char* error = lua_tostring(L,-1);
        cout<<string(error)<<endl;
    }
    lua_pushstring(L,"111");
    if(lua_pcall(L,1,2,0))
    {
        const char* error = lua_tostring(L,-1);
        cout<<string(error)<<endl;
        return;
    }
    if(lua_isnumber(L,-1) && lua_isnumber(L,-2))
    {
        const int a = lua_tonumber(L,-2);
        const int b = lua_tonumber(L,-1);
        cout<<"the result is "<<a<<","<<b<<endl;
    }

    return;
}
int main ( int argc, char *argv[] )
{
    cout<<"读取一行LUA"<<endl;
    char *lua = "print(‘Hello world!‘)";        //创建一个指向lua解释器的指针
    L = luaL_newstate();        //加载lua标准库
    luaL_openlibs(L);    //加载脚本
    luaL_loadbuffer(L,lua,strlen(lua),"line");    //运行脚本
    text1();
    text();
    if (LUA_OK!=lua_pcall(L,0,0,0))    {        //调用失败,添加处理
        }    //关闭并释放资源
    lua_close(L);    //系统命令,暂停
    system("pause");
    return 0;
}
--测试代码
if textC then
    textC()
else
 ax,bx = textC1(100,1)
print("ax= " .. ax .."bx= " .. bx)
end
a = 10
b = 11
function textlua()
    print("this is a lua function")
end
function textlua1(value)
    print("this is a lua function,value = " .. value )
    a = 100
    b = 200
    return a,b
end
table = {
        a = 123,
        b = 456
    }
时间: 2024-10-27 12:53:44

C++ Lua 交互练习!!!!!!!!的相关文章

在C++使用LUA交互,LUA实现闭包,C++/LUA相互闭包

LUA可谓是配置文件神器,具体功能用过才知道,接近两年没用了抽了俩小时熟悉了下基本的用法. 包括C/LUA堆栈操作 函数相互调用 以及LUA的闭包 C++和LUA相互闭包 想要灵活使用LUA必须先要学习 LUA和C的堆栈交互模型 类似于汇编函数调用方式了 很有意思. 要学习LUA首先要理解LUA和C/C++交互的堆栈lua_State  这里引用网友的一篇文章很详细 http://wind-catalpa.blog.163.com/blog/static/11475354320131191031

Linux下C/C++和lua交互-Table

本来这些文章都是在我的个人网站www.zhangyi.studio,目前处在备案状态,暂时访问不了,所以搬到这边.  最近这两天需要弄清楚C++和lua间相互调用和数据传递,废话不多说,直接上过程. 首先是环境环境,Linux(Debian),安装lua,注意需要管理员权限. sudo apt-get install lua5.2 安装完后输入lua或者lua -v 严重是否安装成功以及安装的版本,当然,有了lua运行环境还不够我们还需要安装lua开发库既然我们安装的是lua5.2那么开发库同样

(转)Cocos 2d-X Lua 游戏添加苹果内购(二) OC和Lua交互代码详解

这是第二篇 Cocos 2d-X Lua 游戏添加苹果内购(一) 图文详解准备流程 这是前面的第一篇,详细的说明了怎样添加内购项目以及填写银行信息提交以及沙盒测试员的添加使用以及需要我们注意的东西,结果,被移除首页了!前面第一篇的内容是这篇的基础,前面那些不弄好,下面的商品信息你是请求不到的,这点需要大家特别注意...有需要前面提到的内容的孩子可以点击链接进去自己看看!! 这篇就具体的总结我们Lua和OC交互的内容以及内购具体的代码以及结果的测试说明: 内购部分OC的代码实现 先自己总结一下整个

cocos2d-x学习笔记(c++与lua交互回调函数的处理)

本文假设读者已经会使用tolua++进行C++与lua之间的通讯 1.在头文件中定义注册回调函数,定义在MyClass类中 void register(unsigned short cmdID, LUA_FUNCTION func);//LUA_FUNCTION其实就是一个int void unregister(); 2.实现 void MyClass::register(unsigned short cmdID, LUA_FUNCTION func) { m_luaFunction = fun

Unity和Lua交互

用lua就表示项目用到了热更新,通常每次热更新都会从服务器获取最新的lua脚本放到Android/ios设备的本地目录下,但是lua应该放到哪个目录下呢,这里就先说说lua里面的路径问题 1.不可以放到Resources文件夹下,因为无法找到其在设备下的位置,Resources下的东西是由unity来管理的,使用的时候通过Resources.load/loadAll来加载 2.不可以放到StreamingAssets文件夹,因为在设备下StreamingAssets文件夹里面的资源只能读,不能写

Win32下 Qt与Lua交互使用(二):在Lua脚本中使用Qt类

话接上篇.成功配置好Qt+Lua+toLua后,我们可以实现在Lua脚本中使用各个Qt的类.直接看代码吧. #include "include/lua.hpp" #include <QWidget> #include <QApplication> #include <QFile> #include <QDebug> static int tolua_new_QWidget(lua_State* pState) { QWidget* wid

Win32下 Qt与Lua交互使用(三):在Lua脚本中connect Qt 对象

话接上文.笔者为了方便使用Lua,自己编写了一个Lua的类.主要代码如下: QLua.h 1 #ifndef QLUA_H 2 #define QLUA_H 3 4 // own 5 #include "include/lua.hpp" 6 7 // qt 8 #include <QObject> 9 #include <QFile> 10 #include <QDebug> 11 12 #include <QWidget> 13 #in

Win32下 Qt与Lua交互使用(四):在Lua脚本中自由执行Qt类中的函数

话接上篇.通过前几篇博客,我们实现在Lua脚本中执行Qt类中函数的方法,以及在Lua脚本中连接Qt对象的信号与槽. 但是,我们也能发现,如果希望在Lua脚本中执行Qt类的函数,就必须绑定一个真正实现功能的函数.如QWidget::show(),需要写一个在栈中取出widget指针,widget调用show()函数的方式.如果希望在Lua中调用大量函数,就需要编写大量的C++实现函数.有没有什么省时省力的好方法呢? 上一篇中我们实现了在Lua脚本中连接信号与槽.我们只是传过去了两个QObject的

Win32下 Qt与Lua交互使用:配置Qt下Lua运行环境

Lua与C++之间可以实现非常强的交互性.Lua中可以使用C++中的函数,C++中也可以使用Lua中的函数.由此可以引发出很多奇思妙想了. 简单来说,Lua动态的特性补充了C++的功能.当然,也看你具体怎么用. 笔者经常使用Qt,故准备将Qt和Lua结合在一起.想象一下在Lua脚本中调用如下代码: w = QWidget:new() w:show() 然后弹出一QWidget的窗口,是多么感人的一件事情呀. 好,下面开始配置环境吧. 1. 下载Lua 5.1.目前的最新版本是5.2,但是因为使用