gpt4 book ai didi

delphi - 动态数组是否支持非零下限(为了 VarArrayCreate 兼容性)?

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

我将维护一堆非常旧的 Delphi 代码并将其移植到 Delphi XE2,其中充满了 VarArrayCreate构造假动态数组,其下限不为零。

使用 Variant 的缺点类型有:

  • 比原生数组慢很多(代码执行大量复杂的财务计算,因此速度很重要)
  • 类型不安全(特别是当意外使用了错误的 var... 常量,并且 Variant 系统开始执行不需要的转换或舍入时)

如果我可以使用dynamic arrays,两者都会变得毫无意义。 .

变体数组的好处是它们可以具有非零下限。

我记得动态数组过去总是从下限零开始。

这仍然是真的吗?换句话说:是否可以让动态数组从零以外的边界开始

作为特定情况的前后示例(单维,但代码中充满了多维数组,并且除了 varDouble 之外,代码还使用了其他各种 varXXX TVarData 允许使用的数据类型):

function CalculateVector(aSV: TStrings): Variant;
var
I: Integer;
begin
Result := VarArrayCreate([1,aSV.Count-1],varDouble);
for I := 1 to aSV.Count-1 do
Result[I] := CalculateItem(aSV, I);
end;

CalculateItem 函数返回 Double。界限是从 1aSV.Count-1

当前的替换是这样的,用 Result 的第 0 个空格元素来换取改进的编译时间检查:

type
TVector = array of Double;
function CalculateVector(aSV: TStrings): TVector;
var
I: Integer;
begin
SetLength(Result, aSV.Count); // lower bound is zero, we start at 1 so we ignore the zeroth element
for I := 1 to aSV.Count-1 do
Result[I] := CalculateItem(aSV, I);
end;

最佳答案

动态数组的下限始终为0。因此,对于所有动态数组,low(A) 等于 0。对于空动态数组也是如此,即 nil

来自documentation :

Dynamic arrays are always integer-indexed, always starting from 0.

关于delphi - 动态数组是否支持非零下限(为了 VarArrayCreate 兼容性)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13974022/

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