zoukankan      html  css  js  c++  java
  • [置顶] 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
    ",lua_tostring(L,i);
           printf("%s
    ","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 还不是特别熟,现在还是应用阶段,只能慢慢去深入










     

  • 相关阅读:
    洛谷1052——过河(DP+状态压缩)
    mod4最优路径问题(转载)
    初次接触python,怎么样系统的自学呢?
    对AM信号FFT的matlab仿真
    初次使用自己写的testbench 验证了简单的NOT门。
    写简单的tb(testbench)文件来测试之前的FSM控制的LED
    利用简单的有限状态机(FSM)来实现一个简单的LED流水灯
    利用状态机(FSM)进行简单的uart串口发送数据
    用matlab脚本语言写M文件函数时用三种方法简单实现实现DFT(离散傅里叶变换)
    作为新手对于初次接触matlab的一些感受。
  • 原文地址:https://www.cnblogs.com/james1207/p/3400395.html
Copyright © 2011-2022 走看看