Jer*_*ers 4 delphi variant dynamic-arrays delphi-xe2
我正在维护并向Delphi XE2移植一堆非常旧的Delphi代码,这些代码充满了VarArrayCreate构造,伪造的动态数组的下限不为零.
使用Variant类型的缺点是:
var...常量时,Variant系统开始进行不需要的转换或舍入)如果我可以使用动态数组,两者都可能没有实际意义.
变体数组的好处是它们可以具有非零下界.
我记得的是动态数组总是以零的下限开始.
这仍然是真的吗?换句话说:动态数组是否可以以不同于零的边界开始?
作为示例,针对特定情况的前/后示例(单维,但代码充满了多维数组,除了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;
Run Code Online (Sandbox Code Playgroud)
该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;
Run Code Online (Sandbox Code Playgroud)