1. 程式人生 > 其它 >lazarus研究--動態陣列

lazarus研究--動態陣列

技術標籤:Lazaruslazarus

今天來研究一下動態陣列。直接上程式碼:

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