程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> delphi與變長參數——開放數組(1)

delphi與變長參數——開放數組(1)

編輯:Delphi

 

 與C/C++不同,Delphi中是通過可變類型(TVarRec)的開放數組來指定變長參數的。其實這裡已經不能稱“變長參數”了,因為實際上只傳遞了一個參數,只是該參數是由多個基礎類型數據構成的一個開發數組。Delphi使用開放數組來容納不定數目的參數,使用可變類型(TVarRec)表示各種類型數據,因此二者的結合可以達到C/C++中變長參數的功能。

       TVarRec是一個記錄類型,該記錄的VType字段標志記錄值的類型,如整數、布爾、字符、實數、字符串、指針、類、類引用、接口、變體等。【注1】

 

 

//這是定義在System 單元關於數據類型的一個結構: 

TVarRec = record 

  case Byte of 

    vtInteger:    (VInteger: Integer; VType: Byte); 

    vtBoolean:    (VBoolean: Boolean); 

    vtChar:       (VChar: Char); 

    vtExtended:   (VExtended: PExtended); 

    vtString:     (VString: PShortString); 

    vtPointer:    (VPointer: Pointer); 

    vtPChar:      (VPChar: PChar); 

    vtObject:     (VObject: TObject); 

    vtClass:      (VClass: TClass); 

    vtWideChar:   (VWideChar: WideChar); 

    vtPWideChar:  (VPWideChar: PWideChar); 

    vtAnsiString: (VAnsiString: Pointer); 

    vtCurrency:   (VCurrency: PCurrency); 

    vtVariant:    (VVariant: PVariant); 

    vtInterface:  (VInterface: Pointer); 

    vtWideString: (VWideString: Pointer); 

    vtInt64:      (VInt64: PInt64); 

end; 

 

       那麼開放數組又是什麼?關於開放數組,官方文檔給出的解釋是:

(1)Object Pascal has an “open array” construct that permits an array of unspecified size to be passed to a function.

面向對象Pascal有一個開放數組的概念允許向一個方法傳遞未指定大小的數組。

(2)an Object Pascal function that has an open array parameter can be called by explicitly passing both the pointer to the first element of an array and the value of the last index (number of array elements, minus one).

一個面向對象的含有開放數組參數的Pascal函數能通過傳遞數組的第一個元素的地址和最後一個元素的索引(即數組大小減1)來調用。

 

 

 

//官方例子 

//Object Pascal聲明 

function  Mean(Data:  array of  Double): Extended; 

//Pascal調用 

Result := Mean([3.1, 4.4, 5.6]); 

 

//官方例子 

//C++聲明 

Extended  __fastcall  Mean( const double  * Data,  const int  Data_Size); 

//C++調用 

double  d[] = { 3.1, 4.4, 5.6 } ;  

return  Mean(d, 2) ;  

       看了官方文檔還是一頭霧水,根本就沒解釋什麼是開放數組。好像開放數組與動態數組是一樣的嘛!在Delphi中,數組類型有靜態數組(array[0..1024] of integer)、動態數組(array of integer)兩類。關於動態數組,官方文檔給出的解釋是:

(3)Dynamic arrays do not have a fixed size or length. Instead, memory for a dynamic array is reallocated when you assign a value to the array or pass it to the SetLength procedure.

動態數組沒有固定大小或長度。你可以通過給動態數組賦值或使用SetLength方法給動態數組重新分配內存。

 

 

 

//定義動態數組變量 

var MyFlexibleArray: array of Real; 

//分配內存 

SetLength(MyFlexibleArray, 20);   

 

   動態數組變量是一個隱式指針,它是由引用計數技術進行管理的。其使用方法這裡不多說,這裡看下官方給出的Note。

(4)Note: In some function and procedure declarations, array parameters are represented as array of baseType, without any index types specified.

注意:在一些函數或過程的聲明中,數組參數被描述成沒有索引類型標識符的“array of baseType”形式

 

 

//官方例子 

function CheckStrings(A: array of string): Boolean; 

 

(5)This indicates that the function operates on all arrays of the specified base type, regardless of their size, how they are indexed, or whether they are allocated statically or dynamically.

這表明這個函數可以操作(即接受實參)所有指定的baseType類型的數組,無論該數組的大小是多少、該數組是如何索引的和該數組是靜態分配還是動態分配。

       其實這裡說的就是開放數組參數,這該死的官方文檔,它就是不指明一下。

       網上文章在介紹動態數組時都是用“array of Type”進行定義;而在討論開放數組時又說“array of Type”定義的是開放數組,通過“Type TArr=array of Type;var a:TArr;”定義的才是動態數組。經過大量搜索閱讀,我的理解是:在函數聲明中使用“array of Type”定義形參的是開放數組;而在其他位置使用“array of Type”定義數組變量的是動態數組。

       其實很多時候,只有在討論函數的數組參數時才有開放數組一說,很多時候也是以開放數組參數進行闡述的。這也與官方文檔給出的解釋一致:開放數組是在給方法傳遞數組參數時的一個概念。靜態數組和動態數組都可以傳遞給開放數組參數,Delphi隱式(自動地)傳遞它們的長度。【注2】

       開放數組參數實際上是一個包含指向數組第一個元素地址的指針和調整後以0開始的數組元素的最大索引值(即數組長度減1)的結合物。針對前面聲明Mean函數,它實際上的參數列表如下所示:【注3】

 

function Mean(PData:Pointer; High: Integer): Extended;

 

這一點與前面官方文檔給出的第(2)條解釋一致,只是Delphi使用開放數組參數將這個細節給隱藏了,我們只需將靜態或動態數組的首地址(即數組變量名)傳遞給函數,對於靜態數組,編譯器直接傳遞數組大小(減1),對於動態數組,編譯器自動生成代碼以便在運行時獲取動態數組的High值。

 

 

 


注1:更多有關TVarRec的內容請參考http://docwiki.embarcadero.com/VCL/en/System.TVarRec。

注2:Both static and dynamic arrays may be passed to subroutines as parameters. If the array parameter definition has no range (ie, a dynamic array type), then you must, paradoxically pass a static array as a parameter. Such an array is referred to as an Open array. Delphi passes the length as a hidden parameter to the subroutine.(詳情請參考http://www.delphibasics.co.uk/RTL.asp?Name=Array )

注3:An open array parameter is actually acombination of two parameters, a pointer, which contains the address of the start of the array, and an integer, which contains the High value, adjusted for a zero base.(詳情請參考http://rvelthuis.de/articles/articles-openarr.html的Internals一節)

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved