lua的入门教程-- C++(二)

     在上一节中,讲述了如何产生一个lua的静态链接库,在这一节,将讲述简单使用lua5.1.lib的过程。

     首先先建立一个新的win32 Console Application,在新工程里,为了美观,我将默认生成的文件夹删除,建立了include和src两个文件夹。在根目录下建立了三个文件夹:lib,script,include。

             

      将上节生成的lua5.1.lib放入lib文件夹,将lua源码中的lauxlib.h,lua.h,luaconf.h,lualib.h拷贝到include文件夹。

      在VS上,将根目录中include中的四个头文件加载到include中。在src中建立AMLua.h,AMLua.cpp,AMMain.cpp三个文件。

      

       下面在项目属性页进行一些必要设置,包含依赖项,库路径等。

        C/C++ -- General -- Additional Include Directories:..\include

        Linker -- General -- Additional Library Directories:..\lib

        Linker -- Input -- Additional Dependencies:lua5.1.lib

        另外,检查C/C++ -- General -- Code Generation -- Runtime Library,是否与第一节编译时所记录的Multi-threaded
Debug Dll(/MDd)相同,如果不同,请修改成相同的模式。

 
      -----------------------------------------------分割线-----------------------------------------------

 
      使用lua的配置以及好了,下面开始写代码试试。

 
      首先写一个简单的脚本,在script文件夹中建立sample.lua,里边填上: 

function luaAdd(x, y)
     return x + y
end

        (吐槽下,居然没有lua的模板,只好使用C++的)

       在AMMain.cpp中填上以下代码:

<span style="font-size:18px;">#include <iostream>

extern "C"
{
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
};

int main(int argc, char** argv)
{
	// 初始化一个栈
	lua_State* L = luaL_newstate();

	// 加载lua库
	luaL_openlibs(L);

	// 加载lua文件
	luaL_dofile(L, "..\\script\\sample.lua");

	// 加载函数
	lua_getglobal(L, "luaAdd");

	// 传入参数
	lua_pushnumber(L, 20);
	lua_pushnumber(L, 40);

	// 调用函数,运行
	lua_pcall(L, 2, 1, 0);
	int nSum = 0;
	if(lua_isnumber(L, -1) == 1)
	{
		nSum = lua_tonumber(L, -1);
	}

	std::cout<< "The Sum:\t"<< nSum << std::endl;
	std::cout<< "please wait..." << std::endl;
	getchar();

	return 0;
}</span>

   运行查看结果:输出60;      

下面对AMMain.cpp进行修改,对lua提供的函数进行简单封装:

<span style="font-size:18px;">#include <iostream>

extern "C"
{
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
};

lua_State* L;
int luaAdd(int x, int y);

int main(int argc, char** argv)
{
	// 初始化一个栈
	L = luaL_newstate();

	// 加载lua库
	luaL_openlibs(L);

	// 加载lua文件
	luaL_dofile(L, "..\\script\\sample.lua");

	int nSum = luaAdd(20, 60);

	std::cout<< "The Sum:\t"<< nSum << std::endl;
	std::cout<< "please wait..." << std::endl;
	getchar();

	return 0;
}

int luaAdd(int x, int y)
{
	// 加载函数
	lua_getglobal(L, "luaAdd");

	// 传入参数
	lua_pushnumber(L, x);
	lua_pushnumber(L, y);

	// 调用函数,运行
	lua_pcall(L, 2, 1, 0);
	int nSum = 0;
	if(lua_isnumber(L, -1) == 1)
	{
		nSum = lua_tonumber(L, -1);
	}
	return nSum;
}</span>

       在本节展示了用在C++上调用lua脚本函数。在下一节,将介绍一个第三方库,我们现在C++上写函数,然后在lua中调用此函数,最后在C++中调用这个lua函数。(感觉挺绕的)

时间: 2024-09-28 02:49:52

lua的入门教程-- C++(二)的相关文章

WPF入门教程系列二——Application介绍

原文:WPF入门教程系列二--Application介绍 一.Application介绍 WPF和WinForm 很相似, WPF与WinForm一样有一个 Application对象来进行一些全局的行为和操作,并且每个 Domain (应用程序域)中仅且只有一个 Application 实例存在.和 WinForm 不同的是WPF Application默认由两部分组成 : App.xaml 和 App.xaml.cs,这有点类似于 Asp.Net WebForm,将定义和行为代码相分离. 微

Docker入门教程(二)命令

本文讲的是Docker入门教程(二)命令,[编者的话]DockerOne组织翻译了Flux7的Docker入门教程,本文是系列入门教程的第二篇,介绍了Docker的基本命令以及命令的用法和功能. 在Docker系列教程的第一篇文章中,我们了解了Docker的基础知识,知道了它是如何工作以及如何安装的.在这篇文章中,我们将学习15个Docker命令,并通过实践来学习它是如何工作的. 首先,让我们通过下面的命令来检查Docker的安装是否正确: docker info  如果没有找到这条命令,则表示

SQLite 创建、修改、删除表 入门教程(二)

SQLite 创建.修改.删除表 入门教程(二) 一.数据库教程定义语言 DDL 在关系型数据库中,数据库中的表 Table.视图 View.索引 Index.关系 Relationship 和触发器 Trigger 等等,构成了数据库的架构 Schema. 在 SQL 语句中,专门有一些语句用来定义数据库架构,这些语句被称为"数据库定义语言",即 DDL. SQLite 数据库引擎支持下列三种 DDL 语句: CREATE ALTER TABLE DROP 其中,CREATE 语句用

lua的入门教程-- C++(一)

    本文讲述从www.lua.org下载源码到使用的过程,是一个及其简单的使用入门教程,不涉及语法内容,如有错误,请指出.     准备:VS2008,lua源码     首先先到官网下载源码,本文没有下载最新版本5.2.1,而是采用了5.1.5版本(后边使用的tolua++不支持5.2以上的lua,需要修改才支持,点击这里查看修改方法).将其解压,我们即将用到里边src文件夹中的源码文件.     使用VS2008建立win32 Console Application工程lua5.1,取消

咨询入门教程之二--ERP项目咨询顾问的五大能力

咨询顾问在ERP项目中的作用是举足轻重的.但是,如何选择一个合格的咨询顾问呢?这是比较困难的. 咨询顾问在ERP项目中起的作用就象"指南针",指点了ERP前进的方向.在这个过程中,ERP咨询顾问要面对多重矛盾,如:企业标准流程与实际流程的矛盾,企业内控制度与企业实际操作的矛盾,企业各个阶层之间的矛盾,企业与ERP提供商之间的矛盾.要处理好这方方面面的矛盾,不是一般人可以做到的. 笔者认为,可以从以下几个方面来考核咨询顾问是否合格. 第一,合理假设的能力. 上面说过,ERP咨询就是一个发

Redux 入门教程(二):中间件与异步操作

上一篇文章,我介绍了 Redux 的基本做法:用户发出 Action,Reducer 函数算出新的 State,View 重新渲染. 但是,一个关键问题没有解决:异步操作怎么办?Action 发出以后,Reducer 立即算出 State,这叫做同步:Action 发出以后,过一段时间再执行 Reducer,这就是异步. 怎么才能 Reducer 在异步操作结束后自动执行呢?这就要用到新的工具:中间件(middleware). 一.中间件的概念 为了理解中间件,让我们站在框架作者的角度思考问题:

C++基础入门教程(二):数据、变量、宏等_C 语言

哎,木了个头的,这书太详细了~看得累人 前面部分太过基础了,很多语法方法的东西我也不重复记录了~ 今天才看看C++涉及到数据的一些基础点吧,我把书中稍微比较有营养的部分抽离出来 1.初始化 一般情况下,我们声明和初始化变量是这样的:int iNum = 10; 其实这是延续了C语言的语法,C++还有一种语法,是这样的:int iNum(10); 其实大部分人还是习惯用第一种吧(我也是),但如果哪天我们在别人的代码里看到第二种形式,不要被吓蒙了~ 2.宏定义 宏,用最粗俗,不,是最通俗的说法来解释

Lucene3.0入门教程(二)——索引查询

对已经创建的索引进行查询,即是搜索,这包括两个部份,一是如何直接读取某个索引的所有记录,二是如果对某个索引进行搜索. 一.列出索引里的文档 列出索引需引入的类或包 <%@ page import = "org.apache.lucene.document.*" %> <%@ page import = "org.apache.lucene.index.*" %> <%@ page import = "org.apache.lu

ASP.NET MVC4入门教程(二):添加一个控制器_自学过程

MVC代表: 模型-视图-控制器 .MVC是一个架构良好并且易于测试和易于维护的开发模式.基于MVC模式的应用程序包含: · Models: 表示该应用程序的数据并使用验证逻辑来强制实施业务规则的数据类. · Views: 应用程序动态生成 HTML所使用的模板文件. · Controllers: 处理浏览器的请求,取得数据模型,然后指定要响应浏览器请求的视图模板. 本系列教程,我们将覆盖所有这些概念,并告诉您如何使用它们来构建应用程序. 首先,让我们创建一个控制器类.在解决方案资源管理器中,用