加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – 动态数组是否支持非零下限(对于VarArrayCreate兼容性)

发布时间:2020-12-15 09:20:23 所属栏目:大数据 来源:网络整理
导读:我将维护并移植到Delphi XE2一堆非常旧的Delphi代码,这些代码充满了 VarArrayCreate个构造,伪造的动态数组的下限不为零. 使用Variant类型的缺点是: 比原生数组慢很多(代码执行大量复杂的财务计算,因此速度很重要) 不安全(特别是在偶然使用错误的var …常量
我将维护并移植到Delphi XE2一堆非常旧的Delphi代码,这些代码充满了 VarArrayCreate个构造,伪造的动态数组的下限不为零.

使用Variant类型的缺点是:

>比原生数组慢很多(代码执行大量复杂的财务计算,因此速度很重要)
>不安全(特别是在偶然使用错误的var …常量时,Variant系统开始进行不需要的转换或舍入)

如果我能使用dynamic arrays,两者都可能没有实际意义.

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

我记得的是动态数组总是以零的下限开始.

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

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

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.界限从1到aSV.Count-1.

当前替换是这样的,交换Result的空间第零元素以改进编译时间检查:

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.因此,对于所有动态数组,低(A)等于0.这对于空动态阵列甚至是零也是如此.

从documentation:

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读