• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • 通過例子學習Lua(6)--C/C++中用Lua函數

    發表于:2007-07-04來源:作者:點擊數: 標簽:
    1.簡介 偶們這次主要說說怎么由Lua定義函數, 然后在C或者C++中調用. 這里偶們 暫不涉及C++的對象問題, 只討論調用函數的參數, 返回值和全局變量的使用. 2.程序 這里偶們在e12.lua里先定義一個簡單的add(), x,y為加法的兩個參數, return 直接返回相加后的結果

    1.簡介
      偶們這次主要說說怎么由Lua定義函數, 然后在C或者C++中調用. 這里偶們
      暫不涉及C++的對象問題, 只討論調用函數的參數, 返回值和全局變量的使用.
      
      2.程序
      這里偶們在e12.lua里先定義一個簡單的add(), x,y為加法的兩個參數,
      return 直接返回相加后的結果.
      
      例e12.lua
      -- add two numbers
      function add ( x, y )
      return x + y
      end
      
      在前一次里, 偶們說到 lua_dofile() 可以直接在C中執行lua文件. 因為偶們
      這個程序里只定義了一個add()函數, 所以程序執行后并不直接結果, 效果相當
      于在C中定義了一個函數一樣.
      
      Lua的函數可以有多個參數, 也可以有多個返回值, 這都是由棧(stack)實現的.
      需要調用一個函數時, 就把這個函數壓入棧, 然后順序壓入所有參數, 然后用
      lua_call()調用這個函數. 函數返回后, 返回值也是存放在棧中. 這個過程和
      匯編執行函數調用的過程是一樣的.
      
      例e13.cpp 是一個調用上面的Lua函數的例子
      #include
      
      extern "C" { // 這是個C++程序, 所以要extern "C",
         // 因為lua的頭文件都是C格式的
      #include "lua.h"
      #include "lualib.h"
      #include "lauxlib.h"
      }
      
      /* the Lua interpreter */
      lua_State* L;
      
      int luaadd ( int x, int y )
      {
      int sum;
      
      /* the function name */
      lua_getglobal(L, "add");
      
      /* the first argument */
      lua_pushnumber(L, x);
      
      /* the second argument */
      lua_pushnumber(L, y);
      
      /* call the function with 2
        arguments, return 1 result */
      lua_call(L, 2, 1);
      
      /* get the result */
      sum = (int)lua_tonumber(L, -1);
      lua_pop(L, 1);
      
      return sum;
      }
      
      int main ( int argc, char *argv[] )
      {
      int sum;
      
      /* initialize Lua */
      L = lua_open();
      
      /* load Lua base libraries */
      lua_baselibopen(L);
      
      /* load the script */
      lua_dofile(L, "e12.lua");
      
      /* call the add function */
      sum = luaadd( 10, 15 );
      
      /* print the result */
      printf( "The sum is %d\n", sum );
      
      /* cleanup Lua */
      lua_close(L);
      
      return 0;
      }
      
      程序說明:
      main中過程偶們上次已經說過了, 所以這次只說說luaadd的過程
      * 首先用lua_getglobal()把add函數壓棧
      * 然后用lua_pushnumber()依次把x,y壓棧
      * 然后調用lua_call(), 并且告訴程序偶們有兩個參數一個返回值
      * 接著偶們從棧頂取回返回值, 用lua_tonumber()
      * 最后偶們用lua_pop()把返回值清掉
      
      運行結果:
      The sum is 25
      
      編譯方法
      Linux下把程序存成e13.cpp
      g++ e13.cpp -llua -llualib -o e13
      ./e13
      
      VC下編譯方法
      * 首先建立一個空的Win32 Console Application Project
      * 把e13.cpp加入工程中
      * 點project setting,然后設置link選項, 再加上lua.lib lualib.lib兩個額外的庫
      * 最后編譯
      
      建立好的project可以在這里下載
      VC http://tonyandpaige.com/tutorials/luaadd.zip
      Linux http://tonyandpaige.com/tutorials/luaadd.tar.gz
      
      3.全局變量
      上面偶們用到了lua_getglobal()但并沒有詳細講, 這里偶們再舉兩個小例子來說下全局變量
      lua_getglobal()的作用就是把lua中全局變量的值壓入棧
      lua_getglobal(L, "z");
      z = (int)lua_tonumber(L, 1);
      lua_pop(L, 1);
      假設Lua程序中定義了一個全局變量z, 這段小程序就是把z的值取出放入C的變量z中.
      
      另外Lua中還有一個對應的函數lua_setglobal(), 作用是用棧頂的值填充指定的全局變量
      lua_pushnumber(L, 10);
      lua_setglobal(L, "z");
      例如這段小程序就是把lua中的全局變量z設為10, 如果lua中未定義z的話, 就會自動創建一個
      全局變量z并設為10.
      
      4.試試看
      自己寫個函數用C/C++來調用下試試

    原文轉自:http://www.kjueaiud.com

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>