歡迎訪問 Lu程序設計

在C/C++中使用Lu腳本

目  錄

0 概述 簡要介紹Lu腳本及基本數據類型。
1 C調用Lu腳本函數 C/C++調用Lu腳本函數的最簡單的例子。
2 C模塊化編譯Lu腳本函數 在Lu中,一個模塊由一個或多個表達式(函數)組成。同一模塊中,私有表達式只能被本模塊的表達式所訪問(即調用),在其他模塊中是不可見的;公有表達式或全局表達式能被任何一個表達式所訪問。
3 對Lu模塊進行加鎖 加鎖一個Lu模塊使得其他線程無法向該模塊中增加表達式(腳本函數),這在設計多線程程序時特別有用。
4 C操作Lu腳本變量 C/C++讀取或設置Lu腳本的變量(全局變量或者模塊變量),并測試了存取效率。
5 C注冊常量或函數到Lu系統 C/C++注冊常量或函數到Lu腳本系統,這些常量或函數可在Lu腳本系統中使用。本例中對Lu函數的返回值進行了檢查。
6 C接收Lu系統的字符串信息 C/C++接收Lu系統的字符串信息,這些信息來自于函數o,或者來自注冊到Lu的二級函數。
7 C使用Lu腳本中的動態對象lu 介紹動態對象與靜態對象的區別,以動態對象lu為例,介紹C/C++如何使用Lu腳本的動態對象 ,介紹了Lu鍵樹基礎知識。
8 C使用Lu腳本字符串 介紹C/C++程序如何使用Lu腳本字符串(靜態字符串和動態字符串)。
9 C使用Lu腳本數組 介紹C/C++程序如何使用Lu腳本數組(靜態數組和動態數組)。
10 C使用Lu腳本字符串鍵樹 Lu腳本所有的數據都存儲在Lu字符串鍵樹中;C/C++程序可單獨使用該鍵樹管理自己的數據。
11 C++使用Lu鍵樹實現智能指針 使用Lu字符串鍵樹可幫助C/C++程序實現自動內存回收機制以及方便檢查內存泄露,并測試了運行效率。
12 使用C給Lu靜態類型數據添加運算符重載功能 使用C/C++給Lu靜態類型數據添加運算符重載功能。
13 C注冊動態對象到Lu系統并進行運算符重載 C/C++注冊動態對象到Lu系統,同時進行運算符重載。 演示了二級函數如何返回一個動態對象;演示了二級函數如何通過參數返回多個動態對象;演示了重載函數new、oset、oget、o的用法;演示了 編譯符#在系統擴展中的作用(如何由字符串獲得一個唯一的整數,以及該整數在Lu腳本中如何使用);演示了如何在Lu系統中注冊常量和函數;演示了如何接收Lu系統的字符串信息等等。
14 C對Lu系統內置動態對象進行運算符重載 C/C++對Lu系統內置動態對象進行運算符重載。
15 C使用Lu腳本協程 C/C++使用Lu腳本協程。
16 使用C設計Lu腳本函數時調用Lu腳本函數 使用C/C++設計Lu腳本函數時調用Lu腳本函數,演示了Lu表達式句柄的用法,演示了如何向Lu系統報告運行錯誤。
17 設計多線程程序監控Lu腳本運行 使用C/C++設計多線程程序監控Lu腳本運行;同時演示了如何獲取Lu運行錯誤。
18 C程序使用lu對象(lu表)作為配置文件 C/C++程序使用lu對象(lu表)作為配置文件。演示了如何解析lu對象,演示了編譯符#的用法。
19 用C++設計Lu擴展動態庫 用C/C++設計Lu擴展動態庫 。雖然主程序可以方便地對Lu系統進行擴展,但使用Lu擴展動態庫進行擴展更具有一般性和更大的靈活性。
20 C++使用Lu擴展動態庫 介紹C/C++如何使用Lu擴展動態庫。
21 用C++設計Lu結構、字典、類等高級數據類型 用C/C++設計Lu結構、字典、類等高級數據類型 。很少有腳本允許用戶能方便地添加像字典、結構、類等高級的數據結構,但Lu允許,而且實現這些很容易。
22 C++使用MLu簡化Lu腳本系統的使用 C/C++使用MLu簡化Lu腳本系統的使用。MLu是程序和Lu核心庫之間的一個接口庫,MLu會自動加載Lu核心庫和動態加載多個Lu擴展庫,簡化了Lu系統的使用;MLu可對Lu源程序進行模塊化編譯,能夠編譯運行具有固定格式的源程序(字符串表達式),源程序中可以使用C++風格的注釋。此外,MLu還提供了多個線程互斥地訪問Lu資源的功能;提供了Lu運行監視器,以退出耗時較長的程序;提供在腳本中動態編譯函數的功能;提供錯誤處理函數,實現錯誤(異常)處理的恢復模型等等。
23 在Win32SDK中使用Lu模塊化編譯運行庫MLu 演示如何在Windows程序中加入Lu腳本支持,比較快捷的方式是通過MLu使用Lu腳本。圖示說明 如何在Win32SDK中使用Lu模塊化編譯運行庫MLu。下載源代碼SDKTestMLu.rar。 如果希望得到一個語法高亮的編輯器,可下載源代碼RICHEDTestMLu.rar

0 概述

    說到Lu,很多人會聯想到Lua,但Lu與Lua除了都是腳本之外,其他一點關系都沒有。Lu是一個可對字符串表達式進行動態編譯和運行的動態鏈接庫(dll),是一種易于擴展的輕量級嵌入式腳本,Lu的優勢在于簡單易用和可擴展性強,可用于各類數學軟件的設計,也可用作報表處理、web、組態軟件、游戲等的腳本,具有很高的執行效率。

    Lu使用stdcall調用協議輸出了動態庫函數,可供C/C++、VB、delphi、FORTRAN等程序使用。但受水平和精力所限,本文僅提供C/C++與Lu交互的例子。

    本教程系列通過實例,介紹如何在C/C++中使用Lu腳本。通過本教程系列,可以了解到C/C++程序是如何與Lu進行交互的,包括C/C++程序如何調用Lu的函數、如何訪問Lu的變量,C/C++程序如何注冊函數到Lu腳本系統(也就是Lu腳本如何調用C/C++函數),C/C++程序如何注冊對象到Lu系統,這些對象是如何使用和管理的,C/C++如何使用Lu鍵樹管理自己的動態數據,等等。

    當前,腳本語言種類繁多,如Lua、Python、Go、PHP、JavaScript、VBscript等等,我相信各種腳本會各有各的用途。我將盡可能地將Lu腳本的用途體現在本教程系列里。

    要演示本教程的例子,你必須下載Lu32腳本系統,很明顯,這是32位的Lu腳本系統,本教程系列的例子都是基于32位系統的。當然,稍加修改,這些例子就可以用于64位系統,你可以下載Lu64腳本系統進行嘗試。

    以下資料不是必須的,但對理解本教程有幫助:

    (1)在控制臺程序中演示Lu腳本的步驟圖示:在C中使用Lu腳本步驟圖示在C++中使用Lu腳本步驟圖示

    (2)實用程序OpenLu:用于演示Lu腳本的語法。OpenLu非常小巧,目前只有5M左右,是免安裝的綠色軟件。

    (3)Lu腳本系統說明雖然前面的Lu32腳本系統和OpenLu都包含了該說明,但你可以從這里快速瀏覽。

    (4)Lu編程指南:Lu核心庫(lu32.dll)輸出函數的說明,本教程系列將在實例中展示這些函數的使用。雖然前面的Lu腳本系統中也包含了該說明,但你可以從這里快速瀏覽。

    在開始例子之前,我還要介紹Lu的基本數據類型,這是使用Lu編程最基礎的東西。

    Lu腳本中會存在許多類型的數據,如整數、實數、字符串、邏輯值、函數句柄、對象等等,但在其內部實現上,所有的數據類型都使用同一種結構形式,即:

struct LuData{    //Lu基本數據結構。
    luIFOR x;    
//luIFOR被定義為64位整數__int64,用于存放數據。對于動態數據類型,對象指針約定保存在x的前4個字節中
    luIFOR y;    
//存放數據。
    luIFOR z;    
//存放數據。
    luKEY  VType;
//luKEY被定義為32位整數__int32。擴展數據類型,決定重載函數,從而決定了對數據的操作方式。
    luKEY  BType;
//基本數據類型,決定了Lu數據的結構。
};

    任何Lu數據在賦值時,必須提供基本數據類型BType和擴展數據類型VTypeBType決定了實際的數據結構;VType指出要調用哪一個重載函數(需要專門的篇章對VType作介紹,這里先忽略它)。常見的BType見下表0-1(表中看不懂的部分先不管它,以后用到的時候我們再進行介紹):

表0-1 Lu基本數據類型BType

類別 基本數據類型BType Lu頭文件中定義的標識符 LuData::x LuData::y LuData::z 意 義
靜態類型 0 luStaData_nil       未定義的Lu數據或操作失敗
1 luStaData_forhandle 前32位保存指針     表達式句柄。
2 luStaData_int64 64位整數     64位整數
3 luStaData_double 雙精度實數     64位雙精度實數
4 luStaData_complex 復數實部 復數虛部   復數
5 luStaData_vector x y z 三維向量
系統定義動態類型
-252 luDynData_realarray 前32位保存指針     動態64位實數數組
-253 luDynData_intarray 前32位保存指針     動態64位整數數組
-254 luDynData_string 前32位保存指針     動態字符串
-255 luDynData_lu 前32位保存指針     動態Lu數據
用戶定義動態類型 < -256 < luPriKey_User 前32位保存指針     用戶自定義的私有動態數據類型,均小于-256
> 256 > luPubKey_User 前32位保存指針     用戶自定義的公有動態數據類型,均大于256

    Lu基本數據結構中,數據區占192位,共24個字節。能夠用這24個字節表示的數據稱為靜態類型數據,例如Lu腳本中的整數(8字節)、實數(8字節)、復數(16字節)、三維向量(24字節)等都是簡單數據。設a是一個Lu整數數據,其賦值格式如下:

a.x = 1;                     //賦值為1。
a.
BType = luStaData_int64;   //基本數據類型為整數。
a.VType = luStaData_int64;   //擴展數據類型為luStaData_int64(需要專門的篇章對VType作介紹,這里先忽略它)。

如果a是一個Lu復數數據,其賦值格式如下:

*(double *)&(a.x) = 1.0;     //實部賦值為1.0。
*(double *)&(a.y) = 2.5;
     //虛部賦值為2.5。
a.
BType = luStaData_complex; //基本數據類型為復數。
a.VType = luStaData_complex; //擴展數據類型為luStaData_complex。

    你可能會說,賦值好麻煩嘛。嗯,Lu是強類型的腳本,可以精細地識別各種數據類型,魚與熊掌不可兼得哦。

    靜態類型數據是簡單數據類型,最多存放24個字節的數據,如果數據再大該怎么辦?例如字符串、數組等數據類型,在Lu腳本中該如何表示呢?類似于字符串、數組等占用字節數可多可少,或者占用字節數超過24的數據,Lu腳本中稱之為動態數據類型(或者稱為動態對象)。對于動態對象,在Lu基本數據結構LuData中只保存動態對象的指針,如表0-1所示,對象的32位指針保存在LuData::x的前32位中。關于動態對象及操作,以及如何注冊C/C++動態對象到Lu系統,又是一個較大的話題,以后會有專門的篇章作介紹,這里就不展開了。

    最后,你可能注意到了,我的聯系方式就在下面,如有不明之處或有什么建議,可隨時與我進行聯系。


版權所有© Lu程序設計 2002-2013,保留所有權利
E-mail: [email protected]
  QQ:630715621
最近更新: 2014年03月16日

福利彩票22选5走势图