1

我正在开发类来表示特殊类型的矩阵:

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;

现在在构造函数中,我需要为 Data 和 DifVector 类成员保留内存。如您所见,我使用指向记录数组的指针。所以,主要问题是,我怎样才能正确地保留内存?我想我不能使用这样的东西: 因为我正在失去主要想法 - 在运行时尽可能多地保留内存空间。感谢您的评论。
new(Data);
new(DifVector);

4

2 回答 2

10

由于您使用的是动态数组,array of因此您应该使用 SetLength 来指定数组的长度,这可以动态完成。

IE。像这样:

SetLength(Data, 100);

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

将数组的声明更改为简单数组:

Data: TData;
DifVector: TDifference;

并将它与 SetLength 一起使用,它应该可以解决问题。

于 2008-11-27T22:29:54.257 回答
1

另请注意,在 Delphi 中,动态数组类型的变量存储为指针(在 DotNet 中,您将其称为引用类型)。

除非您将此变量转换为指针,否则编译器不会让您自己进行分配。您应该像已经提到的 lassevk 一样使用 SetLength()。

使用多维数组(如 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'-前缀,您可以遵循此逻辑并使用'R'-前缀作为记录。我知道这有助于我更好地掌握我的代码!

祝你好运!

于 2008-11-28T07:58:02.833 回答