如何使用Delphi填充Struct / Array of Records?

时间:2016-10-13 18:04:18

标签: arrays delphi record

我想填充一系列记录,并且我最近接触过TMappedFile,我试图复制它,实际上没有使用unFileMapping或BlockRead / Write。目的是为了让我的选择保持开放。我发现的问题是它没有启动或正确创建我的阵列。

从目前为止我看到的是,编译后DataArr仍为nil。并导致内存冲突错误(0x00000000),这意味着它是空的/ null。我的工程师已经告诉我,为了达到目的,阵列的大小可能很大,并且还提到我无法做我想做的事情,除非我尊重指针,例如。 DataArr^[0].value1

我相信我的困惑在于SetLength,这似乎与动态数组相反,这就是我评论它的原因。否则我收到错误E2008 incompatible types

type
  TDataStruct = Record
  value1 : array[0..1] of Single;
  value2 : array[0..1] of Single;
  value3 : array[0..1] of Single;
  end;

  TDataStructArray = array[0..MaxInt div SizeOf(TDataStruct) - 1] of TDataStruct;
  PDataStructArray = ^TDataStructArray;

var
  DataArr: PDataStructArray;

begin
  //SetLength(DataArr,length(DataArr)+1);
  DataArr[0].value1[0] := 2;

我尝试过的其他内容使用了FillChar(DataArr,SizeOf(DataArr),0)以及FillChar(DataArr[0], SizeOf(DataArr[0]) * Length(DataArr));

以下链接是我的来源

  1. How to delete an Index of the Dynamic Array of Records
  2. Using New/Dispose with record pointer containing WideString
  3. Assigning a pointer of a record to an array of char in Delphi - come again?
  4. How do i declare an array when i don't know the length until run time

1 个答案:

答案 0 :(得分:7)

dynamic array就是说:动态。

  

动态数组没有固定的大小或长度。相反,当您为数组赋值或将其传递给SetLength过程时,将重新分配动态数组的内存。

声明

DataArr: Array of TDataStruct;

使用SetLength分配记录并同时初始化它们。

SetLength(DataArr,Length(DataArr)+1); // Or preallocate as many as you wish to initialize

访问数组中的记录:

DataArr[0].value1[0] := 2;

在您的示例中,没有进行内存分配,因此出现错误。并且SetLength对动态数组进行操作,而不是对静态数组的指针进行操作。

您可以使用GetMem / FreeMem管理指针并使用ZeroMem进行初始化,但这只会导致构建和维护代码的麻烦。