2008-11-27 64 views
1

我开发类来表示特殊类型的矩阵:如何在Delphi中为指向数组的指针保留内存?

type 
    DifRecord = record 
    Field: String; 
    Number: Byte; 
    Value: smallint; 
    end; 

type 
    TData = array of array of MainModule.DataRecord; 

type 
    TDifference = array of DifRecord; 

type 
    TFogelMatrix = class 
    private 
    M: Byte; 
    N: Byte; 
    Data: ^TData; 
    DifVector: ^TDifference; 
    procedure init(); 
    public 
    constructor Create(Rows, Cols: Byte); 
    destructor Destroy; 
    end; 

现在在构造函数中,我需要保留内存数据和DifVector类成员。如您所见,我使用指向数组的记录。所以,主要问题是,我如何正确地保留内存?我想我不能使用这样的事情:
new(Data);
new(DifVector);
原因我真的失去了主要的想法 - 预留存储空间,就像我想,在运行时。感谢您的评论。

回答

10

由于您使用动态阵列,array of,那么就应该使用SetLength指定数组,它可以动态地进行的长度。

即。像这样:

SetLength(Data, 100); 

这将不会保留100个字节,但将保留足够的空间来容纳任何类型的数组持有的100个元素。

更改为数组声明来简单数组:

Data: TData; 
DifVector: TDifference; 

,并中用SetLength函数使用它,它应该做的伎俩。

+0

和数据呢?它是一个矩阵,所以我需要使用2个参数? SetLength(Data, M, N)? chester89 2008-11-27 22:32:54

1

还要注意的是在Delphi动态数组类型的变量存储为一个指针(在DOTNET的-说话,你会调用这个引用类型)。

除非你施放此变量的指针,编译器不会让你做自己的分配。你应该使用SetLength(),像lassevk已经提到过。

有了多维数组(如TDATA),你可以一气呵成设置两个维度,通过将所有的尺寸与一个调用SetLength()。这导致类似立方体的结构(每个维度具有相等的长度)。但是也可以给一个维度中的每个索引指定与下一个维度不同的长度。有两个维度,这有时称为“锯齿状”数组。

要做到这一点,你会写出来就像这样:

SetLength(Data, SizeOfFirstDimension); 
for i = 0 to SizeOfFirstDimension - 1 do 
    SetLength(Data[i], SizeOfSecondDimensionPerIndex(i)); 

在这个例子中,我使用了一个名为“SizeOfSecondDimensionPerIndex”,以确定在第二维每个数组的大小的功能,但你可以以任何你想要的方式确定这个尺寸。

在一个侧面说明,我会建议你使用“R'前缀的记录类型定义。我知道这不是任何主要的编码风格指南,但是如果您查看指针的'P'前缀,接口的'I'前缀,类字段的'F'前缀,'a'前缀用于参数,'C'作为常量的前缀,'S'作为resourcestring的前缀,你可以遵循这个逻辑并使用'R'作为记录前缀。我知道这帮助我更好地掌握了我的代码!

祝你好运!