lazarus研究--動態陣列
阿新 • • 發佈:2020-12-22
今天來研究一下動態陣列。直接上程式碼:
program project1; {$mode objfpc}{$H+} uses {$IFDEF UNIX}{$IFDEF UseCThreads} cthreads, {$ENDIF}{$ENDIF} Classes { you can add units after this }; //列印陣列 procedure PrintA(Arr:array of Integer); var i:integer; begin for i:=0 to Length(Arr)-1 do begin write(' a',i,'=',arr[i]); end; writeln; end; //過程BadEditA是不能修改實參的 procedure BadEditA(Arr:array of Integer); var i:integer; begin for i:=0 to Length(Arr)-1 do begin arr[i]:=88; end; end; //過程A是可以修改實參的 procedure EditA(VAR Arr:array of Integer); var i:integer; begin for i:=0 to Length(Arr)-1 do //Length函式取動態陣列的元素個數 begin arr[i]:=99; end; end; type IntArray=array of Integer; var dya:array of integer; //動態陣列變數定義 dyb:IntArray; i:integer; //過程EditB形參A前沒有var 但過程內是可以修改實參的 procedure EditB(A:IntArray); var i:integer; begin for i:=0 to Length(A)-1 do begin a[i]:=99; end; end ; begin SetLength(dya,4); //動態陣列使用前要指定元素個數 dya[0]:=1; dya[1]:=2; dya[2]:=3; dya[3]:=4; PrintA(dya); // 原樣輸出 BadEditA(dya); // 妄想把動態陣列所有值變作88 writeln('after do BadEditA:'); PrintA(dya);// 輸出還是原來的樣子,沒有變化 {上面四行執行後輸出結果: a0=1 a1=2 a2=3 a3=4 after do BadEditA: a0=1 a1=2 a2=3 a3=4 } EditA(dya); //想把dya值全部變為99 writeln('after do EditA:'); PrintA(dya); //輸出99 { 上面三行執行後: after do EditA: a0=99 a1=99 a2=99 a3=99 } //------ SetLength(dyb,4); dyb[0]:=1; dyb[1]:=2; dyb[2]:=3; dyb[3]:=4; EditB(dyb); //也可以改變dyb每一個值為99 writeln('after do EditB:'); for i:=0 to length(dyb)-1 do begin write(' dyb',i,'=',dyb[i]); end; writeln; Readln; end.
總結一下吧。
1 定義陣列變數時,沒有指定上下邊界的陣列,即為動態陣列,如下:
var
a:array of integer
2 動態陣列使用前必須設定元素個數,如下:
Setlength(a,4);
3 動態陣列的空間系統自動回收,但也可以手動回收,如下:
Setlength(a,0);
4 要想在過程或函式內更改動態陣列內的元素值,有兩種方法,
其一是在定義形參前加var ,象過程 EditA(VAR Arr:array of Integer);
其二是定義一種新型別,就象EditB(A:IntArray),其中 IntArray 是自定義的型別:
type
IntArray=array of Integer