lazarus研究--动态数组

今天来研究一下动态数组。直接上代码:

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

上一篇:lazarus跨平台编译步骤


下一篇:[转]为Linux下的Lazarus添加中文输入支持