Bar*_*ick 1 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;
Run Code Online (Sandbox Code Playgroud)
我曾尝试使用其他的事情FillChar(DataArr,SizeOf(DataArr),0)和以及FillChar(DataArr[0], SizeOf(DataArr[0]) * Length(DataArr));
以下链接是我的来源
一个动态数组是什么,是说:动感.
动态数组没有固定的大小或长度.而是在为数组赋值或将其传递给SetLength过程时重新分配动态数组的内存.
宣布
DataArr: Array of TDataStruct;
Run Code Online (Sandbox Code Playgroud)
使用SetLength分配记录并同时初始化它们.
SetLength(DataArr,Length(DataArr)+1); // Or preallocate as many as you wish to initialize
Run Code Online (Sandbox Code Playgroud)
访问数组中的记录:
DataArr[0].value1[0] := 2;
Run Code Online (Sandbox Code Playgroud)
在您的示例中,没有进行内存分配,因此出错.并且SetLength在动态数组上运行,而不是在指向静态数组的指针上运行.
您可以使用GetMem/FreeMem管理指针并使用ZeroMem进行初始化,但这只会导致构建和维护代码的麻烦.