• <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-7-04 20:48 | 作者: admin | 來源:  網友評論 | 查看: 67次 | 進入軟件測試論壇討論

    領測軟件測試網

    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/


    關于領測軟件測試網 | 領測軟件測試網合作伙伴 | 廣告服務 | 投稿指南 | 聯系我們 | 網站地圖 | 友情鏈接
    版權所有(C) 2003-2010 TestAge(領測軟件測試網)|領測國際科技(北京)有限公司|軟件測試工程師培訓網 All Rights Reserved
    北京市海淀區中關村南大街9號北京理工科技大廈1402室 京ICP備10010545號-5
    技術支持和業務聯系:info@testage.com.cn 電話:010-51297073

    軟件測試 | 領測國際ISTQBISTQB官網TMMiTMMi認證國際軟件測試工程師認證領測軟件測試網

    老湿亚洲永久精品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>