delphi與變長引數 可變型別開放陣列 3

2021-06-02 06:39:31 字數 1236 閱讀 5608

上接delphi與變長引數——開放陣列(2)。  

現在回到文章開頭提到的可變型別的開放陣列,可變型別的開放陣列允許向單個過程或函式傳遞不同型別表示式的陣列。要定義含有變體開放陣列引數的方法,需要指定「array of const」或「array of tvarrec」作為引數型別。【注1】

//定義含有變體開放陣列引數的方法

procedure dosomething(a: array of const);

procedure dosomething(a: array of tvarrec);

array of const在定義引數時等價於array of tvarrec。array of const 只能指定引數的型別為可變型別的開放陣列引數(array of tvarrec),而不能用其定義陣列變數,但array of tvarrec還可以用來定義tvarrec型別的陣列變數,而且可以將這個陣列變數當作引數傳遞給可變型別的開放陣列引數的方法。

var 

arr:array of const;//錯誤

arr:array of tvarrec;//合法

dosomething(arr);//合法

tvarrec型別用於含有array of const型別的引數的函式內部,編譯器自動通過開放陣列構造器來構造開放陣列引數的實參,

將構造器中的每個元素轉換為tvarrec值,vtype欄位表示每個tvarrec值的簡單型別,可變型別常量(如vtinteger型別時的vinteger)表示為傳遞到tvarrec結構中的標記欄位的值。

雖然tvarrec是可變型別,它能「容納」各種基礎資料型別,但這種「容納」是通過開放陣列構造器來實現的,編譯器本身並不能自動實現,即tvarrec與其他資料型別是不相容的,不能將其他型別的陣列變數傳遞給開放陣列引數的方法。

dosomething([1,2,'a','tht']);//正確

vararr:array[0..10] of integer;

...//賦值

dosomething(arr);//錯誤

開放陣列構造器允許在函式或過程呼叫中直接構造陣列;它們僅用於傳遞開放陣列引數或可變型別開放陣列引數。

與集合構造器相似,開放陣列構造器是乙個由方括號封裝、逗號隔開的表示式序列。開放陣列構造器僅用於傳遞值引數或常量引數。構造器中的表示式必需與開放陣列引數的基型別是賦值相容的。對於可變型別開放陣列引數的情況,表示式可以是不同型別的。【注2】

可變長引數

由於在c語言中沒有函式過載,解決不定數目函式引數問題變得比較麻煩,即使採用c 如果引數個數不能確定,也很難採用函式過載。對這種情況,提出了指標引數來解決問題。如printf 函式,其原型為 int printf const char format,它除了有乙個引數format固定以外,後面跟的引數的...

可變長引數

可變長引數 指的是在呼叫函式時,傳入的引數個數可以不固定 呼叫函式時,傳值的方式無非兩種,一種是位置實參,另一種是關鍵字實參,因此形參也必須得有兩種解決方法,以此來分別接收溢位的位置實參 與關鍵字實參 形參中的會將溢位的位置實參全部接收,然後儲存元組的形式,然後把元組賦值給後的引數。需要注意的是 後...

可變長引數

可變長引數 public class demo06 double.numbers 為可變長引數,如果有多個引數,那麼可變長引數只能放在最後,否則會出錯 在指定引數型別後加乙個省略號 則此引數為可變引數 乙個方法中只能指定乙個可變引數,它必須是方法的最後乙個引數,任何普通的引數必須在它之前宣告 pub...