Lazarus学习笔记(1) 零浪费的动态变长二维数组
**
前言:
**
零空间浪费的变长二维数组C语言里可以用二重指针来实现,在Lazarus中可以不用指针达到同样高的空间利用率,还更简洁。
一、需求
有时候需要动态改变二维数组中的某行一维数组的大小,以达到零空间浪费的目的,但又不想用指针。比如有m个班,每个班有x个学生,数量都是变化的,用定长数组很浪费。
二、实现
为了好展现, 用TCheckBox阵列显示。
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls;
type
{ TForm1 }
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
public
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
type
TArray1 = array of TCheckBox; // 定义一维类型
var
a: array of TArray1; // 加上第二维
procedure TForm1.Button1Click(Sender: TObject);
var i, j: integer;
begin
setlength(a, 4); // 二维长度 4
for i:=0 to 3 do
begin
setlength(a[i], 4+i); // 一维变长 4+i
for j:=0 to 4+i-1 do
begin
a[i][j] := TCheckBox.create(self);
a[i][j].parent:= self;
a[i][j].Left := j*60 +10;
a[i][j].Top := i*30 + 30;
a[i][j].Caption := inttostr(i)+','+inttostr(j);
end;
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
a[0][3].Checked := True; // ok
a[0][5].Checked := True; // error: 访问不存在的元素, 但中C语言里并不显示错,而给出错位的元素。
end;
end.