Lua与C++交互初探之Lua调用C++】的更多相关文章

Lua与C++交互初探之Lua调用C++ 上一篇我们已经成功将Lua的运行环境搭建了起来,也成功在C++里调用了Lua函数.今天我来讲解一下如何在Lua里调用C++函数. Lua作为一个轻量级脚本语言,他只包含了一些必要的系统库函数,当有需要时还得自己去写.有一次我要做一个两数异或的操作发现函数库里居然没有异或运算.不得不非常苦逼的自己去写.后来接触Lua深了之后才知道将这种"缺陷"可以由C函数来弥补.但要做到这一点对于一个对C只知道if else的学生来说确实还是有不少难度. 在学习…
Lua与C++交互初探之C++调用Lua 自从学习了lua这个脚本语言之后,无时不想着将他与c/c++联系起来,看看他真正的威力.奈何水平有限,网上找的代码无论怎样都无法运行成功.我知道是我少了某一步但是又不知道到底少了什么,于是就在各大博客.网站.论坛不断的摸索测试.我也不知道花了多长时间.总之在今天测试成功了.我把我测试遇到的问题和解决过程贴出来供大家参考. 一.lua环境的搭建 建议去网上下载luaforwindow,这是一款跟众多window系统的软件一样,安装起来简单方便,一路点nex…
转自:http://cn.cocos2d-x.org/tutorial/show?id=1474 一.Lua堆栈 要理解Lua和C++交互,首先要理解Lua堆栈. 简单来说,Lua和C/C++语言通信的主要方法是一个无处不在的虚拟栈.栈的特点是先进后出. 在Lua中,Lua堆栈就是一个struct,堆栈索引的方式可是是正数也可以是负数,区别是:正数索引1永远表示栈底,负数索引-1永远表示栈顶.如图: lua的栈类似于以下的定义, 它是在创建lua_State的时候创建的: TValue stac…
转自http://my.oschina.net/mayqlzu/blog/113528 问题: 最近lua很火,因为<愤怒的小鸟>使用了lua,ios上有lua解释器?它是怎么嵌入大ios中的呢?lua的官网说:"lua is an embeddable scripting language",怎么理解呢?怎么在你自己的程序里嵌入lua解释器呢?如果可以在我的程序中嵌入了lua,那是否意味着我可以从此用lua编程了呢? 带着这些问题,打算在我的windows笔记本上做个实验…
Lua 和 C 交互中虚拟栈的操作 /* int lua_pcall(lua_State *L, int nargs, int nresults, int msgh) * 以保护模式调用具有"nargs"个参数,"nresults"个返回值得函数.函数在第一个参数的前一个位置. * 保护模式指的是当调用出错时不会报错,而是返回一个错误码同时将错误信息入栈. * 当调用成功时,函数返回0.将函数名以及参数出栈,之后将函数的返回值入栈. * 无论函数返回多少个返回值,L…
前言 在看了uwa之前发布的<Unity项目常见Lua解决方案性能比较>,决定动手写一篇关于lua+unity方案的性能优化文. 整合lua是目前最强大的unity热更新方案,毕竟这是唯一可以支持ios热更新的办法.然而作为一个重度ulua用户,我们踩过了很多的坑才将ulua上升到一个可以在项目中大规模使用的状态.事实上即使到现在lua+unity的方案仍不能轻易的说可以肆意使用,要用好,你需要知道很多. 因此,这篇文章是从一堆简单的优化建议里头,逐步挖掘出背后的原因.只有理解了原因,才能很清…
什么样类型的函数可以被Lua调用 typedef int (*lua_CFunction) (lua_State *L); 符合类型的函数怎样处理后才可以被Lua调用 使用lua_register或者 lua_pushfunction和lua_setglobal()把要调用的函数加入到lua状态机中. #define lua_register(L,n,f) / (lua_pushcfunction(L, f), lua_setglobal(L, n)) lua_register的第二个参数就是L…
@(语言) Lua是一个嵌入式的语言,可以Lua可以作为程序库用来扩展应用的功能,也可以注册有其他语言实现的函数,这些函数可能由C语言(或其他语言)实现,可以增加一些不容易由Lua实现的功能.这就是Lua这几年在收集游戏开发领域飞速的发展使用的原因,便于热更新,尤其使在IOS平台上.这篇文章主要是自己在学习过程中的一些记录,主要参考一书第二版. 1. 交互栈 在使用过程中,虽然在游戏中我们把lua作为脚本来用,这几年手机游戏其实大量的逻辑都在lua上进行,包括战斗逻辑.尽管如此,使用过程中都会涉…
主要内容转载自:子龙山人博客(强烈建议去子龙山人博客完全学习一遍) 部分内容查阅自:<Lua 5.3  参考手册>中文版 译者 云风 制作 Kavcc vs2013+lua-5.3.3 在上一节<Lua和C++交互 学习记录之八:注册C++类为Lua模块>里介绍了在Lua中以模块的方式使用C++注册的类. 下面将其修改为熟悉的面向对象调用方式. 1.Lua中面向对象的方式 ①在Lua中使用student_obj:get_age()其实相当于student_obj.get_age(s…
主要内容转载自:子龙山人博客(强烈建议去子龙山人博客完全学习一遍) 部分内容查阅自:<Lua 5.3  参考手册>中文版 译者 云风 制作 Kavcc vs2013+lua-5.3.3 1.C++中学生Student类 ①头文件Student.h #pragma once #include <iostream> #include <string> class Student { public: //构造/析构函数 Student(); ~Student(); //get…
主要内容转载自:子龙山人博客(强烈建议去子龙山人博客完全学习一遍) 部分内容查阅自:<Lua 5.3  参考手册>中文版 译者 云风 制作 Kavcc vs2013+lua-5.3.3 1.将C++封装为模块 ①在Lua中调用的函数(和上一节的函数一样) int average(lua_State* L){ //stack_dump(L); //lua->stack,得到Lua调用函数输入的个数 int lua_args_count = lua_gettop(L); //lua->…
主要内容转载自:子龙山人博客(强烈建议去子龙山人博客完全学习一遍) 部分内容查阅自:<Lua 5.3  参考手册>中文版 译者 云风 制作 Kavcc vs2013+lua-5.3.3 1.C++调用Lua中函数 ①Lua中的函数 function add(x,y) return x + y end ②C++调用函数 //lua->stack,全局函数位置-1 lua_getglobal(L, "add"); //c->stack,传入函数参数 lua_push…
主要内容转载自:子龙山人博客(强烈建议去子龙山人博客完全学习一遍) 部分内容查阅自:<Lua 5.3  参考手册>中文版 译者 云风 制作 Kavcc vs2013+lua-5.3.3 1.数组 ①数组是key值从1开始并连续递增的table. ②索引号是从1开始,不是从0开始. 2.既然是table,那当然是可以用上一节的内容进行读写的. lua还提供了一些只针对数组进行操作的API,如下: ①LUALIB_API lua_Integer (luaL_len) (lua_State *L,…
主要内容转载自:子龙山人博客(强烈建议去子龙山人博客完全学习一遍) 部分内容查阅自:<Lua 5.3  参考手册>中文版 译者 云风 制作 Kavcc vs2013+lua-5.3.3 1.理解栈 ①C++通过lua虚拟机中的栈和lua进行交互.(相当于一个中间层) ②C++自己管理内存:lua自动垃圾回收:虚拟机知道在栈里的数据是否有被外部宿主程序使用,从而决定是否进行GC; ③C++的是静态类型:lua是动态类型:通过对静态类型的结构封装类似“Lua_Value”的类型,就能将数据放到栈中…
原文请看:Lua和C++交互详细总结 转自:http://cn.cocos2d-x.org/tutorial/show?id=1474 一.Lua堆栈 要理解Lua和C++交互,首先要理解Lua堆栈. 简单来说,Lua和C/C++语言通信的主要方法是一个无处不在的虚拟栈.栈的特点是先进后出. 在Lua中,Lua堆栈就是一个struct,堆栈索引的方式可是是正数也可以是负数,区别是:正数索引1永远表示栈底,负数索引-1永远表示栈顶.如图: lua的栈类似于以下的定义, 它是在创建lua_State…
主要内容转载自:子龙山人博客(强烈建议去子龙山人博客完全学习一遍) 部分内容查阅自:<Lua 5.3  参考手册>中文版 译者 云风 制作 Kavcc vs2013+lua-5.3.3 1.首先需要编译出lua库 ①创建一个静态库工程,将lua-5.3.3里的所有文件包含到工程里面去 ②进行编译就可以得到一个lua的静态库,提供给后面的测试项目使用 2.创建学习测试console项目 ①引入上面步骤生成的lua静态库 ②包含lua的所有头文件 ③创建一个hello.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.…
转载请标明出处:http://blog.csdn.net/shensky711/article/details/52458051 本文出自: [HansChen的博客] Lua栈 要理解Lua和C++交互,首先要理解Lua堆栈.简单来说,Lua和C/C++语言通信的主要方法是一个无处不在的虚拟栈.栈的特点是先进后出. 在Lua中,Lua堆栈就是一个struct,堆栈索引的方式可是是正数也可以是负数,区别是:正数索引1永远表示栈底,负数索引-1永远表示栈顶,如图: 入栈的数据类型包括数值, 字符串…
主要内容转载自:子龙山人博客(强烈建议去子龙山人博客完全学习一遍) 部分内容查阅自:<Lua 5.3  参考手册>中文版 译者 云风 制作 Kavcc vs2013+lua-5.3.3 1.C++读取Lua中的table ①在hello.lua中设置一个全局table: global_c_read_table = {integer_val = ,double_val = 2.34,string_val = "test_string"} ②在C++中读取 //lua->…
主要内容转载自:子龙山人博客(强烈建议去子龙山人博客完全学习一遍) 部分内容查阅自:<Lua 5.3  参考手册>中文版 译者 云风 制作 Kavcc vs2013+lua-5.3.3 1.C++读取lua中的值 ①在hello.lua中设置一个全局变量: global_c_read_val = "test val" ②在C++里读取 //lua->stack lua_getglobal(L, "global_c_read_val"); //sta…
转自:http://www.cnblogs.com/ringofthec/archive/2010/11/05/luaClosure.html 这里, 简单的记录一下lua中闭包的知识和C闭包调用 前提知识: 在lua api小记2中已经分析了lua中值的结构, 是一个 TValue{value, tt}组合, 如果有疑问, 可以去看一下 一些重要的数据结构 lua中有两种闭包, c闭包和lua闭包 两种闭包的公共部分: #define ClosureHeader CommonHeader;  …
需要掌握知识: lua table的使用(创建自己函数的表作为函数库) 普通函数的调用:tab.func(tab,参数) 等效于表中函数的调用tab:func(参数) 基本思路: 1.在相同目录下创建a.lua  b.lua 2.将a.lua作为我的函数库 1.1 在a.lua中建立一张空表 1.2 在空表中插入函数 1.3 最后a.lua返回这张表 1.4 a.lua 最终演示代码 --作为函数库的表 local Func = {} --开始插入函数 --方法A Func.funcA = fu…
前些日子准备学习下关于lua coroutine更为强大的功能,然而发现根据lua 5.1.4版本来运行一段代码的话也会导致 "lua: attempt to yield across metamethod/C-call boundary"的错误(据悉主线程中调用yield也会如此). 于是就想使用5.2以上的版本试试;windows下没有5.2以上的版本,又不愿意使用VS编译出lua.exe;就在网上搜索下了关于使用命令行生成lua的静态库.动态库.lua.exe和luac.exe资…
1 .下载相应的lua安装包 方法 一 Mointain Lion - Lua 5.2.1 Lion - Lua 5.2.1 Snow Leopard - Lua 5.2.1 Lua 将默认安装到 /usr/local/ ,Lua 解释器完整的路径是 /usr/local/bin/lua,但你不需要输入完整的路径来调用 Lua,在终端中运行 lua 即可调用解释器. 方法 二 打开mac终端,输入: curl -R -O http://www.lua.org/ftp/lua-5.2.3.tar.…
lua作为一种脚本语言,可以快速地开发游戏的原型.提高游戏的开发效率. 在游戏中,lua可以用来完成下面这些工作: ●编辑游戏的用户界面 ●定义.存储和管理基础游戏数据 ●管理实时游戏事件 ●创建和维护开发者友好的游戏存储和载入系统 ●编写游戏游戏的人工智能系统 ●创建功能原型,可以之后用高性能语言移植 编辑游戏界面 进行界面布局.管理用户输入并且输出游戏数据.提高了界面设计的灵活性,为程序员节省不少时间. 管理游戏数据 Lua可以让游戏存储系统更为简单,可以令Lua更方便地和数据库交互.方便按…
Lua 中提供了模块的概念,模块类似一个封装库或者 C++ 中的一个类,可以将公用的部分提到一个文件中,以 API 的形式供其他 lua 文件调用. Lua 中的模块其实就是包含变量.函数等已知元素组成的 table, 本质上是一个 table. 一.模块的声明 创建一个名称为 LearnModule.lua 的文件,并在此文件中实现下列代码: -- 定义一个名为ModuleT的模块,模块的本质就是一个table,内部包含变量和函数等 ModuleT = {} -- 定义一个变量 ModuleT…
Lua 之Module介绍 包管理库提供了从 Lua 中加载模块的基础库. 只有一个导出函数直接放在全局环境中: [require]. 所有其它的部分都导出在表 package 中. require (modname) 加载一个模块. 这个函数首先查找 [package.loaded] 表, 检测 modname 是否被加载过. 如果被加载过,require 返回 package.loaded[modname] 中保存的值. 否则,它会为模块寻找加载器. require 遵循 [package.…
这篇文章参考自http://blog.sina.com.cn/s/blog_991afe570101rdgf.html,十分感谢原作者的伟大创造,本人亲测可行. 这篇文章记录一下如何在MAC系统环境下,搭建LUA脚本最好的编码环境,具有强大的代码补全,而且可以编译运行. 这里使用到的还是sublime text编辑器.下面开始进行详细的介绍: (1)下载sublime text 注意版本号为2.0.2,下载地址:sublime text 2下载地址 (2)安装lua环境(这里用到的是最新的版本:…
table 是 Lua 的一种数据结构用来帮助我们创建不同的数据类型,如:数组.字典等. Lua table 使用关联型数组,你可以用任意类型的值来作数组的索引,但这个值不能是 nil. Lua table 是不固定大小的,你可以根据自己需要进行扩容. Lua也是通过table来解决模块(module).包(package)和对象(Object)的. 例如string.format表示使用"format"来索引table string. table(表)的构造 构造器是创建和初始化表的…
step1.搭建好vs和lua相交互的环境: 1.下载一个lua5.3的源码: 2.有Lua_lib.lib这个文件: 3.开始配置: 鼠标放在工程名那: 右键选属性: 把包含目录点开进行编辑: 地址就选上面有源码的文件路径. 如上,把引用目录点开进行编辑地址是选lib文件的地址 如上,把库目录点开进行编辑地址也是lib文件的地址 step2.给这个工程添加头文件: extern "C" { #include "lua.h" #include "luali…