前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >dnyArray分析,动态数组分析

dnyArray分析,动态数组分析

作者头像
战神伽罗
发布2019-07-24 14:49:17
3740
发布2019-07-24 14:49:17
举报
代码语言:javascript
复制
procedure setlength(p1,p2,p3,p4);
begin
VarArgStart(VAList);
DynArraySetLength(A, TypeInfo, DimCnt, PNativeInt(VAList));
end;
代码语言:javascript
复制
procedure DynArraySetLength(A, TypeInfo, DimCnt, PNativeInt(VAList));
begin
p := a;
newLength := lengthVec^;
if newLength <= 0 then
if newLength < 0 then
Error(reRangeError);
_DynArrayClear(a, typeInfo);
exit;
oldLength := 0;
if p <> nil then
Dec(PByte(p), SizeOf(TDynArrayRec));
oldLength := PDynArrayRec(p).Length;
Inc(PByte(typeInfo), PDynArrayTypeInfo(typeInfo).name);
elSize := PDynArrayTypeInfo(typeInfo).elSize;
if PDynArrayTypeInfo(typeInfo).elType <> nil then
ElTypeInfo := PDynArrayTypeInfo(typeInfo).elType^
ElTypeInfo := nil;
neededSize := newLength*elSize;
if neededSize div newLength <> elSize then
Error(reRangeError);
Inc(neededSize, SizeOf(TDynArrayRec));
if neededSize < 0 then
Error(reRangeError);
if (p = nil) or (PDynArrayRec(p).RefCnt = 1) then
pp := p;
if (newLength < oldLength) and (ElTypeInfo <> nil) then
FinalizeArray(PByte(p) + SizeOf(TDynArrayRec) + newLength*elSize, ElTypeInfo, oldLength - newLength);
ReallocMem(pp, neededSize);
p := pp;
GetMem(p, neededSize);
minLength := oldLength;
if minLength > newLength then
minLength := newLength;
if ElTypeInfo <> nil then
FillChar((PByte(p) + SizeOf(TDynArrayRec))^, minLength*elSize, 0);
__CopyArray(PByte(p) + SizeOf(TDynArrayRec), a, ElTypeInfo, minLength)
Move(PByte(a)^, (PByte(p) + SizeOf(TDynArrayRec))^, minLength*elSize);
_DynArrayClear(a, typeInfo);
PDynArrayRec(p).RefCnt := 1;
PDynArrayRec(p).Length := newLength;
Inc(PByte(p), SizeOf(TDynArrayRec));
if newLength > oldLength then
FillChar((PByte(p) + elSize * oldLength)^, elSize * (newLength - oldLength), 0);
if dimCnt > 1 then
Inc(lengthVec);
Dec(dimCnt);
i := 0;
try
DynArraySetLength(PPointerArray(p)[i], ElTypeInfo, dimCnt, lengthVec);
Inc(i);
while i < newLength do
_DynArrayClear(PPointerArray(p)[j], typeInfo);
for j := 0 to i  do
_DynArrayClear(p, ElTypeInfo);
raise;
a := p;
end;
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档