[置顶] lua 进阶3--lua文件中调用C++函数

前面讲了一下,C++读取lua文件中的变量,包括一维表、二维表这些,这节讲一下如何在lua文件中去调用C++函数

C++代码如下

 

#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 还不是特别熟,现在还是应用阶段,只能慢慢去深入

 










 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值