Delphi 之 第八课 动态数组
Delphi 4 的動態(tài)數(shù)組
傳統(tǒng)的Pascal 語言其數(shù)組大小是預先確定的,當你用數(shù)組結(jié)構(gòu)聲明數(shù)據(jù)類型時,你必須指定數(shù)組元素的個數(shù)。專業(yè)程序員也許知道些許動態(tài)數(shù)組的實現(xiàn)技術(shù),一般是采用指針,用手工分配并釋放所需的內(nèi)存。
Delphi 4中增加了非常簡單的動態(tài)數(shù)組實現(xiàn)方法,實現(xiàn)過程效仿我前面講過的動態(tài)長字符串。與長字符串一樣,動態(tài)數(shù)組的內(nèi)存動態(tài)分配并且引用記數(shù),不過動態(tài)數(shù)組不支持 copy-on-write 技術(shù)。這不是個大問題,因為你可以把變量值設置為nil釋放數(shù)組內(nèi)存。
這樣你就可以聲明一個不指定元素個數(shù)的數(shù)組,并用SetLength 過程給數(shù)組分配一個特定大小的內(nèi)存,SetLength 過程還可以改變數(shù)組大小而不影響其內(nèi)容,除此外還有一些字符串過程也可用于數(shù)組,如Copy 函數(shù)。
以下摘錄的代碼突出了一點,這就是:定義數(shù)組后必須先為它分配內(nèi)存,然后才能開始使用:
procedure TForm1.Button1Click(Sender: TObject); varArray1: array of Integer; beginArray1 [1] := 100; // errorSetLength (Array1, 100);Array1 [99] := 100; // OK... end;如果你只定義一個數(shù)組元素個數(shù),那么索引總是從0開始。Pascal 中的普通數(shù)組既能用不為零的下標,也能用非整數(shù)的下標,但動態(tài)數(shù)組均不支持這兩種下標。象普通數(shù)組一樣,你可以通過Length、High和Low 函數(shù)了解到動態(tài)數(shù)組的狀況,不過對于動態(tài)數(shù)組,Low 函數(shù)返回值總是0,High函數(shù)返回數(shù)組大小減1,這意味著空的動態(tài)數(shù)組其函數(shù)High返回值是-1,這是一個很怪的值,因為它比Low的返回值還小。
圖 8.1: 例 DynArr 窗體
以上作了簡短的介紹,現(xiàn)在舉個簡例,例名DynArr ,見圖8.1。例子實在是很簡單,其實動態(tài)數(shù)組沒有什么特別復雜地方。我想通過該例說明幾個程序員可能犯的錯誤。程序中聲明了兩個全程數(shù)組并在OnCreate 事件中初始化了第一個數(shù)組:
varArray1, Array2: array of Integer;procedure TForm1.FormCreate(Sender: TObject); begin// allocateSetLength (Array1, 100); end;這樣就把數(shù)組所有值設置為0。完成這段代碼你馬上就能讀寫數(shù)組元素的值,而不用害怕內(nèi)存出錯,當然條件是你沒有試圖訪問超過數(shù)組上界的元素。為了更好地初始化,程序中添加了一個按鈕,執(zhí)行數(shù)組元素賦值操作:
procedure TForm1.btnFillClick(Sender: TObject); varI: Integer; beginfor I := Low (Array1) to High (Array1) doArray1 [I] := I; end;Grow 按鈕用于修改數(shù)組大小,但并不影響數(shù)組內(nèi)容。單擊Grow 按鈕后,你可以用Get value按鈕進行檢驗:
procedure TForm1.btnGrowClick(Sender: TObject); begin // grow keeping existing valuesSetLength (Array1, 200); end;procedure TForm1.btnGetClick(Sender: TObject); begin// extractCaption := IntToStr (Array1 [99]); end;Alias 按鈕的OnClick 事件代碼稍復雜些,程序通過 := 算子把一個數(shù)組拷貝給另一個數(shù)組,從而有效地創(chuàng)建了一個別名(一個新變量,但引用內(nèi)存中同一數(shù)組)。從中可見,如果你改變了其中一個數(shù)組,那么另一個同樣也會改變,因為它們指向同一個內(nèi)存區(qū):
procedure TForm1.btnAliasClick(Sender: TObject); begin // aliasArray2 := Array1; // change one (both change)Array2 [99] := 1000; // show the otherCaption := IntToStr (Array1 [99]);在btnAliasClick 事件中增加了兩部分操作內(nèi)容。第一部分是數(shù)組等同測試,不過并不是測試實際的數(shù)組元素,而是測試數(shù)組所引用的內(nèi)存區(qū),檢測變量是不是內(nèi)存中同一數(shù)組的兩個別名:
procedure TForm1.btnAliasClick(Sender: TObject); begin...if Array1 = Array2 thenBeep; // truncate first arrayArray1 := Copy (Array2, 0, 10); end;btnAliasClick 事件的第二部分內(nèi)容是調(diào)用Copy 函數(shù)。該函數(shù)不僅把數(shù)據(jù)從一個數(shù)組移到另一個數(shù)組,而且用函數(shù)創(chuàng)建的新數(shù)組取代第一個數(shù)組,結(jié)果變量Array1 所引用的是11個元素的數(shù)組,因此,按Get value 和Set value 按鈕將產(chǎn)生一個內(nèi)存錯誤,并且觸發(fā)一個異常(除非你把范圍檢查range-checking 選項關(guān)掉,這種情況下,錯誤仍在但屏幕上不會顯示異常)。雖然如此,Fill 按鈕仍能正常工作,因為需要修改的數(shù)組元素由數(shù)組當前的下標范圍確定。
結(jié)束語
這一章內(nèi)容暫時只包括動態(tài)數(shù)組,動態(tài)數(shù)組的確是內(nèi)存管理的重要組成部分,但僅僅是其中的一部分,其它內(nèi)容以后會逐步添加。
本章描述的內(nèi)存結(jié)構(gòu)屬于典型的 Windows 編程內(nèi)容,這方面內(nèi)容將在下一章進行討論。
下一章: Windows 編程
轉(zhuǎn)載于:https://www.cnblogs.com/delphi2014/p/4012681.html
總結(jié)
以上是生活随笔為你收集整理的Delphi 之 第八课 动态数组的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 萝卜的做法大全家常菜?
- 下一篇: 使用WampServer搭建本地PHP环