在某些情况下,我需要设置动态数组的大小,然后用零填充它。
类似的东西:
procedure SetLengthAndZero(VAR X; NewSize: Integer);
begin
SetLength(x, newsize);
if newsize > 0
then FillChar(x[0], length(x)* SizeOf(x[0]), 0);
end;
但上面的代码(显然)不会编译。
答案 0 :(得分:14)
阅读Embarcadero的documentation:
procedure SetLength(var S: <string or dynamic array>; NewLength: Integer);
对于动态数组变量,SetLength将S引用的数组重新分配给给定的长度。保留数组中的现有元素,并将新分配的空间设置为0或nil。
这意味着SetLength
就是你想要的。
如果要清除整个动态数组,不只是分配更多项目并保留现有项目,只需使用SetLength
调用NewLength = 0
,然后再调用所需长度。
通用解决方案:
Type
TDynArrayTool = record
class procedure ClearAndSetLength<T>( var arr : TArray<T>; newLen : Integer); static;
end;
class procedure TDynArrayTool.ClearAndSetLength<T>(var arr: TArray<T>;
newLen: Integer);
begin
Setlength(arr,0);
SetLength(arr,newLen);
end;