Lua与C++ 第五篇(C++调用Lua的函数)

本文转载于:http://blog.csdn.net/musicvs/article/details/8451361

笨木头花心贡献,啥?花心?不呢,是用心~

正文:

经过前面几章的介绍,相信大家对Lua的堆栈已经比较熟悉了,如果还不是很熟悉的朋友,建议多看几遍前面的教程,或者多敲几次代码。

那么,如果已经对Lua的堆栈比较熟悉,接下来的内容就很简单了。

今天我们来看看C++如何调用Lua的函数,先看看现在Lua文件是什么样的:

-- helloLua.lua文件
myName = "beauty girl"  

helloTable = {name = "mutou", IQ = 125}  

function helloAdd(num1, num2)
    return (num1 + num2)
end; 

我们看到多了个helloAdd函数,那么,现在我们要用C++调用这个函数。

(旁白:肯定又要用到getglobal了,每次都有它~!= =)

直接上代码了:

/* C++调用lua的函数 */
void HelloLua::demo3() {
    lua_State* pL = lua_open();
    luaopen_base(pL);  

    /* 执行脚本 */
    luaL_dofile(pL, "helloLua.lua");  

    /* 把helloAdd函数对象放到栈中 */
    lua_getglobal(pL, "helloAdd");  

    /* 把函数所需要的参数入栈 */
    lua_pushnumber(pL, 10);
    lua_pushnumber(pL, 5);  

    /*
        执行函数,第一个参数表示函数的参数个数,第二个参数表示函数返回值个数 ,
        Lua会先去堆栈取出参数,然后再取出函数对象,开始执行函数
    */
    lua_call(pL, 2, 1);  

    int iResult = lua_tonumber(pL, -1);
    CCLOG("iResult = %d", iResult);
}  

简单说明一下步骤:

1) 执行脚本(旁白:我就知道你会说废话。。。)

2) 将helloAdd函数放到栈中:lua_getglobal(pL, “helloAdd”) 。(旁白:看吧,我就知道~!)

3) helloAdd有2个参数,我们要把参数传递给lua,所以2个参数都要放到栈里。

4) 第2和第3步已经把函数所需要的数据都放到栈里了,接下来只要告诉lua去栈里取数据,执行函数~! 调用lua_call即可,注释已经很详细了,这里就不重复了。

(旁白:太简单了点吧,反正不管做什么事情,把东西丢到栈里,然后从栈里取东西,就OK了~你可以滚了,以后教程我来写,你负责吐槽~)

来,大家忽略旁白,教程什么的还是我来写比较好,主要是,吐槽这工作,不符合我的身份~

(旁白:...我有种被打击了的感觉)

本章到此结束,很简单吧?~

下一章我们介绍在Lua中调用C++的函数~!

(旁白:这个我喜欢~!)

时间: 2024-10-29 00:50:08

Lua与C++ 第五篇(C++调用Lua的函数)的相关文章

lua入门之二:c/c++ 调用lua及多个函数返回值的获取

当 Lua 调用 C 函数的时候,使用和 C 调用 Lua 同样类型的栈来交互. C 函数从栈中获取她的參数.调用结束后将返回结果放到栈中.为了区分返回结果和栈中的其它的值,每一个 C 函数还会返回结果的个数(the  function  returns  (in  C)  the  number  of  results  it  is leaving on the stack.). // luacallcpp.cpp : 定义控制台应用程序的入口点. // #include "stdafx.

Lua和C++交互详细总结_3_C++调用Lua

三C++调用Lua 我们经常可以使用Lua文件来作配置文件.类似ini,xml等文件配置信息.现在我们来使用C++来读取Lua文件中的变量,table,函数. lua和c通信时有这样的约定: 所有的lua中的值由lua来管理, c++中产生的值lua不知道, 类似表达了这样一种意思: "如果你(c/c++)想要什么, 你告诉我(lua), 我来产生, 然后放到栈上, 你只能通过api来操作这个值, 我只管我的世界", 这个很重要, 因为: "如果你想要什么, 你告诉我, 我来

Lua与C++ 第四篇(获取Lua表结构数据)

本文转载于:http://blog.csdn.net/musicvs/article/details/8445079 笨木头花心贡献,啥?花心?不呢,是用心~ 正文: 1. 什么是table table是Lua里最强大的数据类型,我们可以当成是数组,但是它又和数组有点不一样,建议大家看看Lua的语法教程,因为我对table也没有熟悉到可以给大家解释的程度. (旁白:那你还写什么教程...) 2. 获取table变量 现在,我们给helloLua.lua文件添加一个table全局变量: -- he

Python基础篇【第五篇】:sed和函数

sed是一个无序且不重复的元素集合 1 class set(object): 2 """ 3 set() -> new empty set object 4 set(iterable) -> new set object 5 6 Build an unordered collection of unique elements. 7 """ 8 def add(self, *args, **kwargs): # real signatu

Lua与C++ 第六篇(Lua调用C++的函数)

本文转载于: http://blog.csdn.net/musicvs/article/details/8451369 笨木头花心贡献,啥?花心?不呢,是用心~ 正文: 1. Lua调用C++的函数 Lua要调用C++的函数还是蛮方便的,首先,我们来创建一个c++函数先: public: static int getNumber(int num); int HelloLua::getNumber( int num ) { CCLOG("getNumber num = %d", num)

uLua学习之调用Lua函数(五)

前言 在我开始这个系列的第一篇文章中,我就提到了Lua脚本用来实现宿主脚本的配置性和扩展性.上节说到的调用外部Lua脚本就对应了它的两大特性之一的配置性,那么另一大特性如何来体现呢?这就要说我们今天的话题了:Lua函数.uLua插件是用来解决unity3d热更新的方案,在我们需要对宿主程序做一些局部逻辑上的修改时,Lua函数就变得至关重要.那么如何在uLua中来调用Lua函数呢,现在就来看看吧!我们将通过两个例子来了解如何调用Lua函数. 第一个例子 首先,这个例子的函数是非常简单的,所以我们就

秒杀多线程第十五篇 关键段,事件,互斥量,信号量的“遗弃”问题

版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 秒杀多线程第十五篇 关键段,事件,互斥量,信号量的“遗弃”问题 在<秒杀多线程第九篇 经典线程同步总结 关键段 事件 互斥量 信号量>中对经典多线程同步互斥问题进行了回顾和总结,这篇文章对Windows系统下常用的线程同步互斥机制——关键段.事件.互斥量.信号量进行了总结.有网友问到互斥量能处理“遗弃”问题,事件和信号量是否也能处理“遗弃”问题.因此本文将对事件和信号量作个试验,看看事件和信号量能否处理“遗弃”问题. 一.

【Python五篇慢慢弹(5)】‘类’过依然继续前行,直至ending再出发

‘类’过依然继续前行,直至ending再出发 作者:白宁超 2016年10月10日22:36:57 摘要:继<快速上手学python>一文之后,笔者又将python官方文档认真学习下.官方给出的pythondoc入门资料包含了基本要点.本文是对文档常用核心要点进行梳理,简单冗余知识不再介绍,作者假使你用c/java/c#/c++任一种语言基础.本系列文章属于入门内容,老鸟可以略看也可以略过,新鸟可以从篇一<快速上手学python>先接触下python怎样安装与运行,以及pychar

C++调用Lua的性能测试

游戏服务器经典的架构就是C++和Lua的结合,C++开发主体框架,Lua实现一些复杂的逻辑.我们都知道Lua是一种非常快的语言,但是到底有多块,我们测试下看看. C++调用Lua的性能测试,发现不对的地方望提出. 实验一:我们使用C++调用Lua带8个以上参数的函数,而这个函数里面什么也没有做.我们通过这个实验能够简单地测试出:使用Lua虚拟机和向调用栈当中传入8+个参数和Lua取出这些参数的时间.但是其中的参数类型比较多样,有整形,浮点型,和数组.实验的Lua函数比较简单,如下: functi