lua--从小白开始(1)

最近在看lua,觉得很有趣,发现没有最新版本的例子,所以自己就别人的博客里弄了源码,然后改成最新版本的lua C API.

关于lua非常基础的就不介绍了,咱们就从简单的测试开始吧。

在此之前如果没有搭好lua在win32下的环境,请看博客:http://blog.csdn.net/xv_ly15/article/details/8548733

1.C/C++执行lua脚本

源码博客链接:http://blog.csdn.net/pizi0475/article/details/5398504

我只是用改用了最新的lua的C API。不多说,直接上代码

/************************************************************************/
/* C/C++执行lua脚本*/
/* url = http://blog.csdn.net/pizi0475/article/details/5398504 */
/************************************************************************/

#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

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

using namespace std;

int main()
{
	lua_State *pLuaState = luaL_newstate();
	/*载入lua基本库*/
	luaL_openlibs(pLuaState);
	//luaopen_base(pLuaState);
	//luaopen_io(pLuaState);				//替换老版本的lua_iolibopen(pLuaState);
	//luaopen_string(pLuaState);			//替换老版本的lua_strlibopen(pLuaState);
	//luaopen_math(pLuaState);			//替换老版本的lua_mathlibopen(pLuaState);
	//luaopen_debug(pLuaState);			//替换老版本的lua_dblibopen(pLuaState);
	/*运行脚本*/
	luaL_dofile(pLuaState,"./script/hw.lua");
	/*清除lua*/
	lua_close(pLuaState);
	/*暂停*/
	cout<<"Press enter to exit…"<<endl;
	getchar();
	return 0;
}

hw.lua的源码:

print("Hello Word!");

这个例子只是简单的执行了一个lua脚本。

其中:lua_newstate是核心函数,要求提供内存分配函数,luaL_newstate是辅助库函数,采用默认的内存分配函数。lua_open是5.0时代的产物,5.1是luaL_newstate的宏,5.2里面已经没有了。

源码和脚本的源代码连接:http://download.csdn.net/detail/shinhwalin/7828949

2.C/C++调用lua函数

话不多说,直接上代码

源码来自:http://blog.csdn.net/pizi0475/article/details/5398497

/************************************************************************/
/* C/C++调用lua函数*/
/* url = http://blog.csdn.net/pizi0475/article/details/5398497 */
/************************************************************************/
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

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

using namespace std;
/************************************************************************/
//函数功能:调用lua函数
//函数参数:
//			L lua虚拟机
//			x
//			y
//函数返回:
//			sum
//核心函数 lua_call()
/*
调用一个函数。

要调用一个函数请遵循以下协议: 首先,要调用的函数应该被压入堆栈; 接着,把需要传递给这个函数的参数按正序压栈;
这是指第一个参数首先压栈。 最后调用一下 lua_call; nargs 是你压入堆栈的参数个数。 当函数调用完毕后,所有的参数以及函数本身都会出栈。
而函数的返回值这时则被压入堆栈。 返回值的个数将被调整为 nresults 个, 除非 nresults 被设置成 LUA_MULTRET。
在这种情况下,所有的返回值都被压入堆栈中。 Lua 会保证返回值都放入栈空间中。
函数返回值将按正序压栈(第一个返回值首先压栈), 因此在调用结束后,最后一个返回值将被放在栈顶。
被调用函数内发生的错误将(通过 longjmp)一直上抛。
*/
/************************************************************************/

int luaadd(lua_State *L, int x, int y)
{
	int sum;
	/*通过名字获取Lua函数*/
	lua_getglobal(L,"add");
	/*向栈中压入第一个参数*/
	lua_pushnumber(L,x);
	/*向栈中压入第二个参数*/
	lua_pushnumber(L,y);
	/*调用函数*/
	lua_call(L,2,1);
	/*得到结果
	把给定索引处的 Lua 值转换为 lua_Integer 这样一个有符号整数类型。
	这个 Lua 值必须是一个数字或是一个可以转换为数字的字符串,否则,lua_tointeger 返回 0 。*/
	sum = (int)lua_tointeger(L,-1);
	/*从堆栈中弹出 n 个元素*/
			//n
	lua_pop(L,1);
	return sum;
}

int main()
{
	int sum;
	/*初始化lua虚拟机*/
	lua_State *L = luaL_newstate();
	/*载入lua基本库*/
	luaL_openlibs(L);
	/*载入脚本*/
	luaL_dofile(L,"./script/test.lua");
	/*调用lua函数*/
	sum = luaadd(L,10,15);
	/*显示结果*/
	cout<<"The sum = "<<sum<<endl;
	/*清除lua虚拟机*/
	lua_close(L);
	/*显示结果并暂停*/
	cout<<"Press enter to exit…"<<endl;
	getchar();
	return 0;
}

test.lua代码为:

function add(x,y)
	return x + y;
end

其中关于lua的堆栈问题,目前我还没有了解,希望大家多多指教。

源码链接:http://download.csdn.net/download/shinhwalin/7829083

3.lua调用C/C++函数

源码来自:http://blog.csdn.net/pizi0475/article/details/5398488

代码为:

/************************************************************************/
/* lua调用C/C++函数*/
/* url = http://blog.csdn.net/pizi0475/article/details/5398488 */
/************************************************************************/
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

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

using namespace std;

static int average(lua_State *L)
{
	/*得到参数个数*/
	int n = lua_gettop(L);
	/*定义和*/
	double sum = 0;
	/*循环变量*/
	int i;
	/*循环取值求和*/
	for (i = 1; i <= n; i++)
	{
		sum += lua_tonumber(L,i);
		//cout<<sum<<endl;
	}
	//cout<<"fffffff"<<endl;
	/*压入平均值*/
	lua_pushnumber(L,sum/n);
	/*压入和*/
	lua_pushnumber(L,sum);
	/*返回返回值个数*/
	return 2;
}

int main()
{
	/*初始化Lua虚拟机*/
	lua_State *L = luaL_newstate();
	/*打开lua基本库*/
	luaL_openlibs(L);
	/*注册函数*/
	lua_register(L,"average",average);
	/*运行脚本*/
	luaL_dofile(L,"./script/avg.lua");
	/*清除lua虚拟机*/
	lua_close(L);
	/*打印暂停*/
	cout<<"Press enter to exit…"<<endl;
	getchar();
	return 0;
}

avg.lua源码为:

function main()
	local avg,sum = average(2,2,2,2,2);
	print("The avg is",avg);
	print("The sum is", sum);
end

main();

源码链接:http://download.csdn.net/detail/shinhwalin/7829139

时间: 2024-08-24 17:46:23

lua--从小白开始(1)的相关文章

【游戏开发】小白学Lua(上)

在很多游戏中,脚本语言是不可或缺的一部分,很多游戏都使用到了Lua,js,python一类的脚本,脚本语言可以在很多方面给开发进程带来帮助.脚本语言可以作为初始化文件读入变量和游戏数据的一个快速而方便的方法.它们通常因为具有节省编译时间提高生产效率.提高创造性和拓展性的有点而受到众多游戏开发厂商的青睐.在本篇博客中,马三将和大家一起学习一下Lua这门脚本语言. 一.搭建Lua运行环境 学习任何一门编程语言恐怕都是要先搭建起来它的开发环境,这样才能多写代码多练习.Lua有一个交互的解释程序(lua

【小白学Lua】之Lua变长参数和unpack函数

一.简介 Lua的变长参数和unpack函数在实际的开发中应用的还挺多的,比如在设计print函数的时候,需要支持对多个变量进行打印输出,这时我们就需要用到Lua中的变长参数和unpack函数了. 二.Lua变长参数与unpack函数 Lua中支持可变参数,用 ... 表示.比如定义下面的这样一个函数: local function func1(...) end 当然它也支持在变长参数前面添加固定参数: local function func1(var,...) --dosomething en

小白日记14:kali渗透测试--NMAP

NAMP 被认为是最强大的扫描器 所有参数 [email protected]:~# nmap Nmap 7.01 ( https://nmap.org ) Usage: nmap [Scan Type(s)] [Options] {target specification} TARGET SPECIFICATION: <strong> #目标发现</strong> Can pass hostnames, IP addresses, networks, etc. Ex: scanm

online_jf.lua --累计在线时间领取物品(积分)的lua脚本

原作者: ayase 8-27修正 修复首次使用后的红字不需要额外进数据库导入计分表,这lua全自动生成 --------------------------------------------------------------惯例写在前面: 写这玩意其实学习性更大于目的性..= =研究了两天晚上写的我人参中滴第一个lua脚本,居然还真给我写出来了,好感动由于写代码的基础基本是零 所以碰了N+N次壁 什么函数字母大小写还要区分  -- 闹哪样啊喂 因为这个原因我试了半个多钟才发现问题所在什么函

Lua中的元表与元方法

前言 元表对应的英文是metatable,元方法是metamethod.我们都知道,在C++中,两个类是无法直接相加的,但是,如果你重载了“+”符号,就可以进行类的加法运算.在Lua中也有这个道理,两个table类型的变量,你是无法直接进行“+”操作的,如果你定义了一个指定的函数,就可以进行了.那这篇博文就是主要讲的如何定义这个指定的函数,这个指定的函数是什么?希望对学习Lua的朋友有帮助. Lua是怎么做的? 通常,Lua中的每个值都有一套预定义的操作集合,比如数字是可以相加的,字符串是可以连

(原创) cocos2d-x 3.0+ lua 学习和工作(4) : 公共函数(5): 返回指定表格中的所有键(key):table.keys

这里的函数主要用来做:返回指定表格中所有的键.参考资料为quick_cocos. 星月倾心贡献~~~ --[[ -- 返回指定表格中的所有键(key) -- example: local t = ( a = 1, b = 2, c = 3 ) local keys = table.keys( t ) -- keys = { "a", "b", "c" } -- @param t 要检查的表格(t表示是table) -- @param table

(原创) cocos2d-x 3.0+ lua 学习和工作(4) : 公共函数(7): 其他table方法

看了下其他的table方法,好像没有什么好说的,注释里已经写的很明白了,这里就不罗嗦了~(小白:懒...).参考资料为quick_cocos. 星月倾心贡献~~~ --[[ -- 返回指定表格中的所有值(value) -- example local t = { a = 1, b = 2, c = 3 } local values = table.values( t ) -- values = { 1, 2, 3 } -- @parame t 要检查的表格(t表示是table) -- @para

(原创) cocos2d-x 3.0+ lua 学习和工作(4) : 公共函数(8): 生成只读table

这个函数的作用是:生成只读table. --[[ -- 生成只读table -- @param table t 需要不允许修改的table example: local tb = {"星期一", "星期二", "星期日"} local days = readOnly( tb ); days[2] = "星期三哪去了啊?" ; "[string \"Functions.lua\"]:466: 别修改

(原创) cocos2d-x 3.0+ lua 学习和工作(4) : 公共函数(6): 合并表格:table.merge

这里的函数主要用来做:合并表格.参考资料为quick_cocos. 星月倾心贡献~~~ --[[ -- 将 来源表格 中所有键及值复制到 目标表格 对象中,如果存在同名键,则覆盖其值 -- example local tDest = { a = 1, b = 2 } local tSrc = { c = 3, d = 4 } table.merge( tDest, tSrc ) -- tDest = { a = 1, b = 2, c = 3, d = 4 } -- @param tDest 目

Lua语言基础汇总(8) -- Lua中的元表与元方法

前言 元表对应的英文是metatable,元方法是metamethod.我们都知道,在C++中,两个类是无法直接相加的,但是,如果你重载了“+”符号,就可以进行类的加法运算.在Lua中也有这个道理,两个table类型的变量,你是无法直接进行“+”操作的,如果你定义了一个指定的函数,就可以进行了.那本文就是主要讲的是如何定义这个指定的函数,这个指定的函数是什么?希望对学习Lua的朋友有帮助. Lua是怎么做的? 通常,Lua中的每个值都有一套预定义的操作集合,比如数字是可以相加的,字符串是可以连接