- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我致力于我们软件的标准数据类。这是当前状态的最小示例:
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
中构思一个具有通用写入功能的数据结构。挑战(至少对于我这个业余爱好者来说)是:
mydata
的大小可变,具体取决于子结构并基于不同的枚举类型mydata
我唯一的想法(忽略第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 具有内在函数 Low和 High
您不需要知道数组的大小。
I still want to access mydata with an enumerated type in the sub structs
使用 succ
和 pred
内部方法来遍历枚举。
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/
我是一名优秀的程序员,十分优秀!