学习材料:https://www.runoob.com/lua/lua-tutorial.html

开发环境:SciTE

学习目标:学会使用Lua语法,并在C++中调用

学习时长:预计两天掌握


Lua基本语法

  • --单行注释,--[[  code ]]--   
  • 多行注释推荐使用 --[=[注释内容]=],这样可以避免遇到table[table[idx]]时就将多行注释结束’

Lua数据类型

数据类型 描述
nil 这个最简单,只有值nil属于该类,表示一个无效值(在条件表达式中相当于false)。
boolean 包含两个值:false和true。
number 表示双精度类型的实浮点数
string 字符串由一对双引号或单引号来表示
function 由 C 或 Lua 编写的函数
userdata 表示任意存储在变量中的C数据结构
thread 表示执行的独立线路,用于执行协同程序
table Lua 中的表(table)其实是一个"关联数组"(associative arrays),数组的索引可以是数字、字符串或表类型。在 Lua 里,table 的创建是通过"构造表达式"来完成,最简单构造表达式是{},用来创建一个空表。

 

nil

  • 一个未定义的变量,输出为nil
  • 对于全局变量和table,nil可以起到删除的作用
    tab1 = {key1  = "val1",key2 ="val2","val3"}
    for k,v in pairs(tab1) do
    	print(k .. "-" .. v)
    end
    
    tab1.key1 =nil;
    for k,v in pairs(tab1) do
    	print(k .. "-" .. v)
    end
    
  • 变量类型与nil作比较需要这样写:print(type(x) =="nil")

boolean

  • Lua中,nil和false都可以认为是假

number

  • 平时看到的数字都是

string

  • [[   ]]中间可以加很多行,并且输出会保留空格和回车
  • print("2" + "6") 是8
  • “a” .. "b"  可以得到"ab"

table

  • table = vector + map ,并且下标从1开始
  • table在求长度的时候要用泛型for循环,tb[1],tb[2],tb[4] #tb=2

function

  • 当作函数指针用就好啦

thread

  • 线程和协程的区别:线程可以同一时刻有多个在运行,而协程任意一个时刻只能有一个在运行

userdate

  • 程序员自定义的结构体和指针(没实践过)

Lua变量

  • 默认都是全局,除非用local指定是局部变量
  • a,b=b,a  (等价于swap(a,b))
  • 应该尽可能使用局部变量,原因不用多说

Lua循环

for

  • 数值FOR  :   for var =st,ed,delta
  • 泛型FOR  :   for i,v in pairs(tableA) do   print()  end

Lua函数

  • local function fuction_name(arg1,arg2,arg3) do ... end
  • ...代表可变数组长度
    function average(...)
       result = 0
       local arg={...}
       for i,v in ipairs(arg) do
          result = result + v
       end
       print("总共传入 " .. select("#",...) .. " 个数")
       return result/select("#",...)
    end
    
    print("平均值为",average(10,5,3,4,5,6))
  • 获取可变数组的总长度,第n个
  • do
        function foo(...)
            for i = 1, select('#', ...) do  -->获取参数总数
                local arg = select(i, ...); -->读取参数
                print("arg", arg);
            end
        end
    
        foo(nil,nil);
    end
    

原表

  • 简单的理解:对于一个表如果找不到要的数据,就找另一个表

VisualStudio中调用Lua

  • C/C++:项目属性→常规→附加包含目录Include
  • 链接器:常规→附加库目录lib文件夹
  • 链接器:输入→附加依赖项lua5.1.lib lua51.lib
//用Lua编译器编译
extern "C" {
#include "lua.h"
#include "lauxlib.h"
#include "lualib.h"
}
#include <cstring>
int main()
{
	lua_State* L = lua_open();
	luaopen_base(L);
	//luaL_loadfile(L, "C:/Users/76422/Desktop/testjob.lua");
	char ch[256] = "print(996)";
	luaL_loadbuffer(L, ch, strlen(ch), "haha");
	lua_pcall(L, 0, 0, 0);

	lua_close(L);
}

//获取Lua中的全局变量
extern "C" {
#include "lua.h"
#include "lauxlib.h"
#include "lualib.h"
}
#include <cstring>
#include<stdio.h>
int main()
{
	lua_State* L = lua_open();
	luaopen_base(L);

	//luaL_loadfile(L, "C:/Users/76422/Desktop/testjob.lua");
	//lua_pcall(L, 0, 0, 0); 
	luaL_dofile(L, "C:/Users/76422/Desktop/test.lua");
	lua_getglobal(L, "a");
	int a = lua_tonumber(L, -1);
	printf("a=%d\n",a);

	lua_close(L);
}

//执行Lua脚本中的函数
extern "C" {
#include "lua.h"
#include "lauxlib.h"
#include "lualib.h"
}
#include <cstring>
#include<stdio.h>
int main()
{
	lua_State* L = lua_open();
	luaopen_base(L);

	//luaL_loadfile(L, "C:/Users/76422/Desktop/testjob.lua");
	//lua_pcall(L, 0, 0, 0); 
	luaL_dofile(L, "C:/Users/76422/Desktop/test.lua");
	lua_getglobal(L, "get");
	lua_pushnumber(L,996);
	lua_pcall(L,1,1,0);
	int x = lua_tonumber(L, -1);
	

	lua_close(L);
}

//获取Lua脚本中Table的某个内容,每次gettable会把table也清空,因此取完一次后,要再执行lua_getglobal(L, "window") 一次
extern "C" {
#include "lua.h"
#include "lauxlib.h"
#include "lualib.h"
}
#include <cstring>
#include<stdio.h>

int getValue(lua_State* L, const char* c) {
	lua_getglobal(L, "window");
	lua_pushstring(L, c);
	lua_gettable(L, -2);
	int res = lua_tonumber(L, -1);
	lua_pop(L, -1);
	printf("cnt = %d  res = %d\n",lua_gettop(L),res);
	return res;
}

int main()
{
	lua_State* L = lua_open();
	luaopen_base(L);

	//luaL_loadfile(L, "C:/Users/76422/Desktop/testjob.lua");
	//lua_pcall(L, 0, 0, 0); 
	luaL_dofile(L, "C:/Users/76422/Desktop/test.lua");
	lua_settop(L, 0);
	int wide = getValue(L, "wide");
	int height = getValue(L,"hight");

	lua_close(L);
}

 

C调用Lua(C)到此,基本上已经学会了如何使用,下一节是学习如果在Lua中调用C


在Lua中调用C

//
extern "C" {
#include "lua.h"
#include "lauxlib.h"
#include "lualib.h"
}
#include <cstring>
#include<stdio.h>

int getValue(lua_State* L, const char* c) {
	lua_getglobal(L, "window");
	lua_pushstring(L, c);
	lua_gettable(L, -2);
	int res = lua_tonumber(L, -1);
	lua_pop(L, -1);
	printf("cnt = %d  res = %d\n",lua_gettop(L),res);
	return res;
}

int main()
{
	lua_State* L = lua_open();
	luaopen_base(L);

	//luaL_loadfile(L, "C:/Users/76422/Desktop/testjob.lua");
	//lua_pcall(L, 0, 0, 0); 
	int x = 30;
	lua_pushnumber(L, x);
	lua_setglobal(L, "x");
	luaL_dofile(L, "C:/Users/76422/Desktop/test.lua");
	//lua_settop(L, 0);
	//int wide = getValue(L, "wide");
	//int height = getValue(L,"hight");

	lua_close(L);
}

extern "C" {
#include "lua.h"
#include "lauxlib.h"
#include "lualib.h"
}
#include <cstring>
#include<stdio.h>

int getValue(lua_State* L, const char* c) {
	lua_getglobal(L, "window");
	lua_pushstring(L, c);
	lua_gettable(L, -2);
	int res = lua_tonumber(L, -1);
	lua_pop(L, -1);
	printf("cnt = %d  res = %d\n",lua_gettop(L),res);
	return res;
}
//table全局变量
int main()
{
	lua_State* L = lua_open();
	luaopen_base(L);

	//luaL_loadfile(L, "C:/Users/76422/Desktop/testjob.lua");
	//lua_pcall(L, 0, 0, 0); 
	lua_settop(L, 0);
	int wide = 22333;
	int height = 2;
	lua_newtable(L);
	lua_pushstring(L, "width");
	lua_pushnumber(L, wide);
	lua_settable(L, -3);
	printf("cnt = %d \n", lua_gettop(L));
	lua_pushstring(L, "height");
	lua_pushnumber(L, height);
	lua_settable(L, -3);
	printf("222cnt = %d \n", lua_gettop(L));
	lua_setglobal(L,"t1");
	luaL_dofile(L, "C:/Users/76422/Desktop/test.lua");

	//int wide = getValue(L, "wide");
	//int height = getValue(L,"hight");

	lua_close(L);
}

//Lua调用C++函数
extern "C" {
#include "lua.h"
#include "lauxlib.h"
#include "lualib.h"
}
#include <cstring>
#include<stdio.h>
int wide = 996;
int getValue(lua_State* L) {
	lua_pushnumber(L, wide);
	lua_pushnumber(L, 88);
	return 2;
}

int main()
{
	lua_State* L = lua_open();
	luaopen_base(L);

	//luaL_loadfile(L, "C:/Users/76422/Desktop/testjob.lua");
	//lua_pcall(L, 0, 0, 0); 
	lua_settop(L, 0);
	lua_pushcfunction(L, getValue);
	lua_setglobal(L,"eee");
	luaL_dofile(L, "C:/Users/76422/Desktop/test.lua");

	//int wide = getValue(L, "wide");
	//int height = getValue(L,"hight");

	lua_close(L);
}

//只会传一个,传2个有问题,问题暂留
extern "C" {
#include "lua.h"
#include "lauxlib.h"
#include "lualib.h"
}
#include <cstring>
#include<stdio.h>
int wide = 996;
int getValue(lua_State* L) {
	int sz = lua_tonumber(L, -1);
	lua_pop(L,-1);
	lua_pushnumber(L, wide *sz);
	lua_pushnumber(L, 88 *sz);
	return 2;
}

int main()
{
	lua_State* L = lua_open();
	luaopen_base(L);

	//luaL_loadfile(L, "C:/Users/76422/Desktop/testjob.lua");
	//lua_pcall(L, 0, 0, 0); 
	lua_settop(L, 0);
	lua_pushcfunction(L, getValue);
	lua_setglobal(L,"eee");
	luaL_dofile(L, "C:/Users/76422/Desktop/test.lua");

	//int wide = getValue(L, "wide");
	//int height = getValue(L,"hight");

	lua_close(L);
}