个人面试笔记:Lua与C++调用相关

1、lua虚拟机和C++相互调用、lua设计基础的相关博客,供以后复习:

http://cn.cocos2d-x.org/tutorial/show?id=1474

http://blog.csdn.net/ym012/article/details/7209637

http://www.cnblogs.com/sifenkesi/p/3876745.html

http://my.oschina.net/xlplbo/blog/314956

http://blog.csdn.net/dongdongdongjl/article/details/8629704

2、本人的环境文档:链接:http://pan.baidu.com/s/1o6FROMY 密码:o7vt

或者:https://github.com/wjingzhe/LuaCppSrc

直接使用源码配置。luac.c和lua.c相关说明参照:

http://blog.csdn.net/dongdongdongjl/article/details/8629704

3、分析文章待续,先熟悉lua机的源码。cocos2d-x中,添加C++和luaScript的桥接函数,比如:

int lua_cocos2dx_3d_Skeleton3D_getBoneByName(lua_State* tolua_S)

{

int argc = 0;

cocos2d::Skeleton3D* cobj = nullptr;

bool ok  = true;

#if COCOS2D_DEBUG >= 1

tolua_Error tolua_err;

#endif

#if COCOS2D_DEBUG >= 1

if (!tolua_isusertype(tolua_S,1,"cc.Skeleton3D",0,&tolua_err)) goto tolua_lerror;

#endif

cobj = (cocos2d::Skeleton3D*)tolua_tousertype(tolua_S,1,0);

#if COCOS2D_DEBUG >= 1

if (!cobj)

{

tolua_error(tolua_S,"invalid ‘cobj‘ in function ‘lua_cocos2dx_3d_Skeleton3D_getBoneByName‘", nullptr);

return 0;

}

#endif

argc = lua_gettop(tolua_S)-1;

if (argc == 1)

{

std::string arg0;

ok &= luaval_to_std_string(tolua_S, 2,&arg0, "cc.Skeleton3D:getBoneByName");

if(!ok)

{

tolua_error(tolua_S,"invalid arguments in function ‘lua_cocos2dx_3d_Skeleton3D_getBoneByName‘", nullptr);

return 0;

}

cocos2d::Bone3D* ret = cobj->getBoneByName(arg0);

object_to_luaval<cocos2d::Bone3D>(tolua_S, "cc.Bone3D",(cocos2d::Bone3D*)ret);

return 1;

}

luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.Skeleton3D:getBoneByName",argc, 1);

return 0;

#if COCOS2D_DEBUG >= 1

tolua_lerror:

tolua_error(tolua_S,"#ferror in function ‘lua_cocos2dx_3d_Skeleton3D_getBoneByName‘.",&tolua_err);

#endif

return 0;

}

4、前几天面试遗留:

1)lua的table本身是由两块内存组成,一块是连续的array,另外一块则是hashTable实现的。因为没看过源码不确认数组这块的存储,就没有提及

2)lua的调用栈从1到N为栈增加,即从栈底向栈顶进发。-1为栈顶,-N为栈底。具体的内存结构还没看

3)QuickSort和HeapSort的确切代码,主要在于QuickSort的非递归实现。非递归没真正实现过了,今晚处理一下。

4)认真考究cocos2d的主线线程流程,有利于以后做架构优化

5、lua脚本调用C++,则是先压函数地址为0下标位;C++、lua入栈从左参数开始入栈。C++若调用lua的函数则需要使用lua_call;Lua只能调用使用特定格式的函数:

定义一个C/C++函数:

代码:typedef int (*lua_CFunction) (lua_State *L); //要求参数和返回值必须和这个一直,即可以赋值函数指针给lua_CFunction的都可以被调用

函数必须以Lua解释器作为参数,并且返回值为int类型。既然Lua解释器作为函数的参数,那么实际上函数可以从栈中取得任意多个参数。下面我 们将看到,返回的整数值代表入栈的值的数目。如果有一个C/C++函数,你想在Lua中调用他,很容易封装一下就可以满足上述要求。

6、上面一条成为C++粘合层,cocos2d-lua的分支就是增加了粘合层来建立lua虚拟机和C++库的连接,同时删减没必要了模块。这个粘合层在设计模式中叫做代理,早前云风曾经提到是否使用类似的设计,如果真要提供库,必须减少粘合层的厚度才能保证健壮性

lua这边的库也要实现Lua的粘合层,才能使得脚本开发时使用的是和C++类似的API。

cocos的粘合层需要重新编写一边,这也是为什么自定义库需要使用luabinding等工具方便。而维护引擎必须也要熟悉cocos接口设计思想,如第3条,都会根据参数个数去实现粘合调用的是哪个接口,quick引擎组要做的事情大部分是这个吧。

时间: 2024-08-27 17:34:49

个人面试笔记:Lua与C++调用相关的相关文章

Lua学习笔记--Lua调用C初探

上次学习了怎么用C调用Lua的函数,并返回一个结果,这次看看怎么反过来,用Lua调用C的函数. 一.简介 C调用Lua函数比较简单,只需要操作相关的栈就可以了,但是Lua调用C的话,稍微有一点麻烦,虽然还是用栈来进行数据的传递,但是由于Lua中本身没有C中写的函数,所以需要多一步将C函数注册到Lua中的步骤. Lua反过来调用C函数的话,首先,我们要写一个要被调用的函数,这个函数有一个格式的要求 ,返回值为int,但是这个int并不代表Lua函数的返回值,而是函数返回值的个数,Lua支持多重返回

Java面试笔记

1.&和&& if(str != null& !str.equals("")){ System.out.println("ok"); }//抛空指针异常 if(str != null&& !str.equals("")){ System.out.println("ok"); }//正常编译 &还可以用作位运算符,当&操作符两边的表达式不是boolean类型时,&a

linux学习笔记(一)-文件目录相关的命令&&文件通配符

一.几个命令概述 1.查看目录以及目录底下的文件:ls(-a显示隐藏文件:-d显示目录本身:-l显示详细内容:-R递归显示,即把子目录的文件也显示出来:-h以更加被人类理解的格式显示,比如显示文件大小的时候用M为单位显示:-i显示文件索引ID) 2.查看文件内容:cat,head,tail,less,more,tac cat:将文件连接起来,输出在屏幕上,可接多个文件(-E:显示隐藏的换行符:-n:显示出行号) head:默认查看文件的前10行(-n#:查看文件的前#行.空白行也是一行) tai

C程序与Lua脚本相互调用

Lua脚本是一种可用于C程序开发/测试的工具,本篇介绍一下C程序与Lua脚本如何进行相互调用,更加详细的操作参见<Programing in Lua>.本文分为3个部分:1.Windows环境下Lua的下载以及安装注意事项:2.Visual C++6.0中Lua的配置:3.C程序与Lua脚本相互调用实例. 1.Windows环境下Lua的下载以及安装注意事项 a.下载Lua for Windows,笔者用的版本是V5.1.4-35: b.上微软官网,下载Visual C++运行库——vcred

【转载】前端面试“http全过程”将所有HTTP相关知识抛出来了...

原文:前端面试“http全过程”将所有HTTP相关知识抛出来了... 来一篇串通,一个http全过程的问题,把所有HTTP相关知识点都带过一遍 http全过程 输入域名(url)-->DNS映射为IP-->TCP三次握手-->HTTP请求-->HTTP响应-->(浏览器跟踪重定向地址)-->服务器处理请求-->服务器返回一个html响应-->(视情况决定释放TCP连接)-->客户端解析HTML-->获取嵌入在HTML中的对象重新发起http请求

C 可变长参数运用-----编写Lua的通用调用函数

1.C可变长参数 printf这个使用频繁的C语言函数的参数列表包含一个const char*的描述串,还有一个可变长参数(...) ,如下为printf的函数声明. int printf(const char * __restrict, ...) 在stdarg.h这个头文件中包含着对可变长参数进行操作的一些宏(x86平台为例): #define va_start(ap,v)( ap = (va_list)&v + _INTSIZEOF(v) ) #define va_arg(ap,t) ( 

远程调用相关技术

相关术语: 中间件:中间件是一种独立的系统软件或服务程序,分布式应用软件借助这种软件在不同的技术之间共享资源.中间件位于客户机/ 服务器的操作系统之上,管理计算机资源和网络通讯.是连接两个独立应用程序或独立系统的软件.相连接的系统,即使它们具有不同的接口,但通过中间件相互之间仍能交换信息.执行中间件的一个关键途径是信息传递.通过中间件,应用程序可以工作于多平台或 OS 环境. 中间件(middleware)是基础软件的一大类,属于可复用软件的范畴.顾名思义,中间件处于操作系统软件与用户的应用软件

Lua脚本怎么样调用外部脚本?

在游戏脚本开发中,我们往往会发现脚本量非常大,而且我们经常会在一下核心脚本文件中定义一些常用的功能函数,但是Lua脚本没有提供include关键词,那又是怎样调用外部函数的呢?如何实现脚本的Include功能? test.lua脚本定义main函数如下: function main(szName, num1, num2)     print("main()", szName, num1, num2);     local nRandMax = 10000;     local nRan

tengine lua 开源一 调用内部接口高效发送文件

tengine  lua 开源一 调用内部接口高效发送文件 开源自己封装的sendfile 模块,可以高效的通过lua发送文件 源码地址:https://github.com/weinyzhou/Lua-sendfile 调用方法 local sendfile=require "sendfile"; sendfile.call(filename,-1,-1); 第一个参数文件名, 第二个参数开始位置 第三个参数长度