在设计一些需要数组的例程时,可能不知道该数组中会需要多少个元素,可能是10个,100个,1000个等.这些都只有到了实际运行的时候才能得到答案.由于对数组不确定大小,因此很难将数组声明一个局部变量(声明过大,会使栈负担过重),所以在堆上进行分配.
delphi支持的第一种技术
type
PMyArray:^TMyArray; TMyArray : Array[0..0] of TMyType; //声明一个TMyType类型的数组 begin GetMem(PMyArray,42 * SizeOf(TMyType));//分配42个TMyType内存大小 //释放PMyArray FreeMem(PMyArray,42 * SizeOf(TMyType)); end;
直到释放内存,PMyArray都指向一个包含42个TMyType元素的数组,编译代码时无法使用{$R+}进行越界检查,因为编译器认为数组中只有一个元素.因此只有一个下标能使用=>0
第二种方法
通过将数组类型的上界置为一个很大的数,也可以解决,但会带来一个负面的作用:作何未达到上界的限制的下标值都将变得合法.如
对于一个42个某种类型的元素数组,若分配以1000个元素,在编译进行越界检查时,所以42~999的下标都将合法
第二个问题 是所分配的变量对于数组中有多少元素没有记录,一般情况下,必须将元素的个数保存为一个变量,并且对应于所分配的数组确定此变量.这样就可以自行完成越界检查.
不过,在我们每天的编程工作中这一技术扔然得到了大量作用.例如,SysUtils单元中有一个极为灵活的数组类型 TByteArray 指向些类型的指针为PByteArray.使用这个类型(或其指针),可以很容易地将一个无类型缓冲区参数的参数的类型强制为一个字节数组.其中还有其他一些数组类型.比如longint word等
所以,最好的想法是创建一个数组类,从而使你可以根据需要来分配尽可能多的元素,甚至可以扩展或缩小数组的大小(增加或减少元数个数). 因些,类似于对元素进行排序、删除、或插入一个新元素等等其他的一些方法也就很容易了.基本做法是创建一个数组类的实例,在构造函数中声明每个元素的大小,再由对象来处理内存分配问题
模拟List类 TAdvRecordList
明天写