lua 进阶3--lua文件中调用C++函数
2014-10-21 17:35
387 查看
前面讲了一下,C++读取lua文件中的变量,包括一维表、二维表这些,这节讲一下如何在lua文件中去调用C++函数
C++代码如下
<pre name="code" class="cpp">#include <stdio.h>
extern "C"{
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
}
/*Lua 解释器指针
*/
lua_State* L;
static int average(lua_State *L)
{
/*得到参数个数*/
int n=lua_gettop(L);
double sum=0;
int i;
for(i=1;i<=n;i++)
{
if(!lua_isnumber(L,i))
{
lua_pushstring(L,"Incorrect argument to 'average'");
printf("%s\n",lua_tostring(L,i);
printf("%s\n","is not a number");
}
else
{
sum+=lua_tonumber(L,i);
}
}
/*压入平均值*/
lua_pushnumber(L,sum/n);
/*压入和*/
lua_pushnumber(L,sum);
/*返回返回值的个数*/
return 2;
}
int main ( int argc, char *argv[] ){
/*初始化Lua
*/
L=lua_open();
/*载入lua基本库*/
luaL_openlibs(L);
lua_register(L,"average",average);
/*运行脚本
*/
luaL_dofile(L,"test.lua");
/*清除Lua
*/
lua_close(L);
/*暂停*/
printf("Press enter to exit ..");
getchar();
return 0;
}
lua 文件(test.lua)的代码如下
注意 最主要的是
要写一个能让Lua调用的C函数,就要符合lua_CFunction定义:typedef int (*lua_CFunction) (lua_State *L);
当Lua调用C函数的时候,同样使用栈来交互。C函数从栈中获取她的参数,调用结束后将结果放到栈中,并返回放到栈中的结果个数。
这儿有一个重要的概念:用来交互的栈不是全局栈,每一个函数都有他自己的私有栈。当Lua调用C函数的时候,第一个参数总是在这个私有栈的index=1的位置
上面定义的C函数是 static int average(lua_State *L) static 可要可不要 static 函数只表示在当前文件中可用,在其他文件中不可用
/*压入平均值*/
lua_pushnumber(L,sum/n); (表示将结果压入栈中 t[1])
/*压入和*/
lua_pushnumber(L,sum); (表示将结果压入栈中 t[2])
/*返回返回值的个数*/
return 2;
如果返回值有多个 比如3个 那么一定要return 3 否则的话(比如还是return 2 ,那么有一个返回值获取不到 而且返回值顺序也不对应) 不成功
lua_register(L,"average",average); // 第二个参数表示提供给lua文件的接口 第三个参数 C++中的函数名
初学lua 还不是特别熟,现在还是应用阶段,只能慢慢去深入
C++代码如下
<pre name="code" class="cpp">#include <stdio.h>
extern "C"{
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
}
/*Lua 解释器指针
*/
lua_State* L;
static int average(lua_State *L)
{
/*得到参数个数*/
int n=lua_gettop(L);
double sum=0;
int i;
for(i=1;i<=n;i++)
{
if(!lua_isnumber(L,i))
{
lua_pushstring(L,"Incorrect argument to 'average'");
printf("%s\n",lua_tostring(L,i);
printf("%s\n","is not a number");
}
else
{
sum+=lua_tonumber(L,i);
}
}
/*压入平均值*/
lua_pushnumber(L,sum/n);
/*压入和*/
lua_pushnumber(L,sum);
/*返回返回值的个数*/
return 2;
}
int main ( int argc, char *argv[] ){
/*初始化Lua
*/
L=lua_open();
/*载入lua基本库*/
luaL_openlibs(L);
lua_register(L,"average",average);
/*运行脚本
*/
luaL_dofile(L,"test.lua");
/*清除Lua
*/
lua_close(L);
/*暂停*/
printf("Press enter to exit ..");
getchar();
return 0;
}
lua 文件(test.lua)的代码如下
--call a C++ function avg,sum = average(10,20,30,40,50,"ssss") print("The average is ",avg) print("The sum is",sum)
注意 最主要的是
要写一个能让Lua调用的C函数,就要符合lua_CFunction定义:typedef int (*lua_CFunction) (lua_State *L);
当Lua调用C函数的时候,同样使用栈来交互。C函数从栈中获取她的参数,调用结束后将结果放到栈中,并返回放到栈中的结果个数。
这儿有一个重要的概念:用来交互的栈不是全局栈,每一个函数都有他自己的私有栈。当Lua调用C函数的时候,第一个参数总是在这个私有栈的index=1的位置
上面定义的C函数是 static int average(lua_State *L) static 可要可不要 static 函数只表示在当前文件中可用,在其他文件中不可用
/*压入平均值*/
lua_pushnumber(L,sum/n); (表示将结果压入栈中 t[1])
/*压入和*/
lua_pushnumber(L,sum); (表示将结果压入栈中 t[2])
/*返回返回值的个数*/
return 2;
如果返回值有多个 比如3个 那么一定要return 3 否则的话(比如还是return 2 ,那么有一个返回值获取不到 而且返回值顺序也不对应) 不成功
lua_register(L,"average",average); // 第二个参数表示提供给lua文件的接口 第三个参数 C++中的函数名
初学lua 还不是特别熟,现在还是应用阶段,只能慢慢去深入
相关文章推荐
- lua进阶1 ---C++ 中调用lua文件
- lua进阶5-C++调用lua函数
- lua进阶6--使用require 函数进行文件的调用
- lua进阶5--C++调用lua函数
- c++调用lua函数
- lua脚本调用C++动态库中的函数
- 069 - 问,lua程序设计(第四部分)笔记三,c++调用lua函数 - everettjf - C++博客
- 解决c++ 调用lua 方式! 避免重复写逻辑对应的lua 函数
- 在Lua中调用c++函数示例
- 简答的lua调用c++函数例子
- 关于Lua调用c++ DLL 文件的详解
- 最简单的C++中调用LUA函数源代码
- lua调用C++函数崩溃时,查看lua的调用栈信息 (特别适用于tolua++)
- lua学习(三)--------lua调用c++函数和简单的错误处理
- C/C++文件中函数互相调用
- 使用C++调用 LUA 函数收藏
- C++ 调用其他文件的变量或函数
- Lua文件函数调用
- tolua++绑定C/C++语言函数供lua调用
- Lua与C/C++的交互5:C/C++调用Lua函数