delphi - 使用 TArrays 的多维记录,如何在 Delphi 10.3 中设置长度
问题描述
我在尝试使用 TArrays 在数据结构中创建第三维时遇到问题。TSensorGroupSeries 中的长度如何设置?--> SetLength(fSensorValues, fNbrSensors) 在下面的例子中;
我正在尝试创建一个具有传感器的时间序列,其中每个传感器提供不同的测量值(8 个值,例如:temp、hum、...),其中每个传感器的测量类型相同。每个位置的传感器数量变化:每个位置最少 2 个传感器,最多 16 个传感器。每 15 分钟进行一次测量。
问候
program Project2;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils;
const
cSensDiffData = 8;
cMinSensors = 2;
cMaxSensors = 16;
type
TSensorValues = record
fData : Array[0 .. cSensDiffData-1] of Integer;
end;
TSensorGroup = record
fSensorValues : TArray<TSensorValues>;
class var
fNbrSensors : Byte;
constructor Create (NbrSensors : byte);
end;
TSensorGroupSeries = record
fSensorGroup : TArray<TSensorGroup>;
class var
fSeriesLength : Integer;
constructor Create (SeriesLength : Integer; NbrSensors : Byte);
end;
{ TSensorGroup }
constructor TSensorGroup.Create (NbrSensors: Byte);
begin
case NbrSensors of
cMinSensors .. cMaxSensors :
begin
fNbrSensors := NbrSensors;
SetLength(fSensorValues, fNbrSensors);
end
else
raise Exception.Create('Nbr Sensors outside range: ' + NbrSensors.ToString + ' ' + cMinSensors.ToString + ' .. ' + cMaxSensors.ToString);
end;
end;
var
i : integer;
s : string;
SensorGroup : TSensorGroup;
SensorGroupSeries : TSensorGroupSeries;
{ TSensorGroupSeries }
constructor TSensorGroupSeries.Create(SeriesLength : Integer; NbrSensors : Byte);
var
i, j : integer;
aSensorGroup : TSensorGroup;
begin
aSensorGroup := TSensorGroup.Create(NbrSensors);
fSeriesLength := SeriesLength;
SetLength(fSensorGroup, fSeriesLength); // how is the system knowing the real length
end;
begin
// two dimensional data access is working..
SensorGroup := TSensorGroup.Create(6);
SensorGroup.fSensorValues[1].fData[2] := 12;
writeln('Nbr Sensors defined: ' + SensorGroup.fNbrSensors.ToString);
writeln('value at 0/0: ' + SensorGroup.fSensorValues[0].fData[0].ToString);
writeln('value at 1/2: ' + SensorGroup.fSensorValues[1].fData[2].ToString);
writeln('value at max: ' + SensorGroup.fSensorValues[6-1].fData[cSensDiffData-1].ToString);
readln;
// three dimensional data is causing access error
SensorGroupSeries := TSensorGroupSeries.Create(100,4);
SensorGroupSeries.fSensorGroup[5].fSensorValues[2].fData[2]:=5; // line, where error occurs
writeln(SensorGroupSeries.fSensorGroup[5].fSensorValues[2].fData[2].ToString);
readln;
end.
解决方案
您正在初始化 ASensorGroup,但没有使用它。实际上,SensorGroupSeries 的所有元素都未初始化,因此长度都为零。
这是更正的构造函数:
constructor TSensorGroupSeries.Create(SeriesLength : Integer; NbrSensors : Byte);
var
i : integer;
begin
fSeriesLength := SeriesLength;
SetLength(fSensorGroup, fSeriesLength); // how is the system knowing the real length
for i := 0 to fSeriesLength - 1 do
begin
fSensorGroup[ i ].Create( NbrSensors );
end;
end;
我已经对此进行了测试,并且可以正常工作。
推荐阅读
- c# - 我在使用一些 c# windows 窗体代码时遇到了一些问题
- pine-script - 安全功能,intrabar 迭代
- python - 如果其排名易变,我如何根据数据框中的值确定起搏?
- rust - 守护调度线程池
- python - 在另一台机器上训练模型时,使用 Docker tensorflow/serving 部署失败
- ios - 如何在表格视图控制器中当前显示的内容的中心准确显示弹出视图?
- hash - 了解哈希锁原子交换
- python - 如何使用 for 循环附加到 Numpy 数组
- c# - 在 xamarin 表单上预加载页面
- typescript - Typescript/Jest 模拟服务中的共享功能