gpt4 book ai didi

arrays - 使用枚举类型访问动态数组

转载 作者:行者123 更新时间:2023-12-03 15:28:21 25 4
gpt4 key购买 nike

我致力于我们软件的标准数据类。这是当前状态的最小示例:

  TDataOne = (Width, Length, Height);
TDataTwo = (Diameter, Weight);

TDatStruct = class;

TDatSubStructOne = class(TDatStruct)
public
myData : array[TDataOne] of double;
procedure writeToFile(AFileName : string);
end;
TDatSubStructTwo = class(TDatStruct)
public
myData : array[TDataTwo] of double;
procedure writeToFile(AFileName : string);
end;

为了减少代码冗余,我想在TDatStruct中构思一个具有通用写入功能的数据结构。挑战(至少对于我这个业余爱好者来说)是:

  1. mydata 的大小可变,具体取决于子结构并基于不同的枚举类型
  2. 我仍然想使用子结构中的枚举类型访问 mydata
  3. 由于实际代码中不同数组的数量,我不想将子结构数据作为参数传递给公共(public)写入函数

我唯一的想法(忽略第3点)是将子结构的数组数据作为开放数组参数传递给公共(public)写入过程,如下所示:

writeToFile(AFileName : string; writeData : array of double);

有没有办法将动态数组与枚举类型或虚拟枚举数组结合起来?还是我完全走错了路?

最佳答案

mydata is of variable size depending on the substruct and bases on different enum types

Delphi 具有内在函数 LowHigh
您不需要知道数组的大小。

I still want to access mydata with an enumerated type in the sub structs

使用 succpred 内部方法来遍历枚举。

I do not want to pass the sub structure data as parameter to the common write function because of the number of different arrays in the real code

你所有的数组对我来说看起来都一样......它们只是 double 组,尽管元素数量不同。

您可以像这样实现writeToFile:

procedure writeArrayToFile(const AFileName : string; const writeData : array of double);
var
i: integer;
begin
for i:= low(writeData) to High(writeData) do begin
WriteADoubleToFile(AFilename, writeData[i]);
end; {for i}
end;

请注意 const 的使用,如果不使用它,数组将被复制到堆栈,从而导致大数组出现巨大的延迟。

如果数组是类的数据成员,那么您可以简单地编写如下代码:

procedure TDatStruct.writeToFile(const AFileName : string);
begin
WriteArrayToFile(FileName, GetMyData^);
end;

请注意,由于父类 TDatStruct 实际上内部没有任何数据,因此您需要编写一个虚函数来获取该数据。

type 
TMyArray = array[0..0] of double;
PMyArray = ^TMyArray;

.....
TDatStruct = class
protected
function GetMyData: PMyArray; virtual; abstract;
public
procedure WriteToFile(const Filename: string); //no need for virtual
end;

open array parameter WriteArrayToFile 将为您解决该问题。

请注意,writeToFile 中的数组参数是“开放数组参数”,这将接受静态和动态数组。

如果您使用不同类型的数组( double /字符串等)。
然后使用通用方法。

Is there any way to combine a dynamic array with an enumerated type or a virtual enumerated array? Or am I completely on the wrong path?

动态数组的元素数量可变。
您不能直接使用枚举对其进行索引。
但是,您可以使用 Ord 将枚举值转换为整数。内在函数。
它还适用于具有超过 256 个值的枚举。 文档不正确,它将根据需要返回字节、单词或基数。

function FixedArrayToDynamicArray(const input: array of double): TArray<double>;  
begin
//translate a fixed array to a dynamic array.
SetLength(Result, High(input));
Move(input[0], Result[0], SizeOf(Double) * High(input));
end;

预泛型代码变为:

type 
TDoubleArray = array of double;

function FixedArrayToDynamicArray(const input: array of double): TDoubleArray;
... same from here on.

关于arrays - 使用枚举类型访问动态数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37032547/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com