咨询”包括动态数组的记录(结构体)“的快速复制方法 delphi结构复制 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 //定义部分//SStrips声明 type SStrip = record JobType : Integer; UpDst, DnDst : Double; MchnID : Integer; BlksVol : SVolAndSpls; end; type TStrips = Array of SStrip;//SAltern声明 type SAltern = record BlkObjID : Integer; MchnGrpID : Integer; Strips : ^TStrips; //这一行是不是该加个指针 Tried : ShortInt; MachEquiped : Boolean; ValidNow : Boolean; Wght : Double; end; TAlterns = array of SAltern; 用反射,你这种最好弄成class,因为delphi的反射对class支持的比较好,操作起来会方便不少。 原变量为Src1、动态数组TStrip指定地址SStrips;2、数组中的每个地址,要创建一个SStrips指针对应。副本变量名为Tgt1、同样创建动态数组个数与TStrip一致;2、数组中的每个地址,不要复制指针地址。而是分别创建SStrips实体,保存该变量地址;3、通过循环语句复制原变量为Src的每个地址的SStrip值。这样,就是完全复制。 @doloopcn 谢谢你的关注@pathletboy 反射应该是用到RTTI的信息来处理,那样通用性当然好,赶上解释型语言了,但是速度受到字符串处理影响会慢。所以没采用,但是确实是行之有效的方法@lyhoo163 谢谢关注,我在多次通用尝试失败后,在通用和速度之间选择了速度。针对特定的类写的CopyAItem(覆盖基类的CopyAItem方法),无法实现通用性奉上实现的代码 Tgt^ := Src^; AltnCnt := Length(Src.Altns); if AltnCnt > 0 then begin //如果没有数据,其指向是nil不需要处理 SetLength(Tgt.Altns, AltnCnt); Tgt.Altns := Copy(Src.Altns); for AltnIdx := 0 to AltnCnt - 1 do begin StrpCnt := Length(Src.Altns[AltnIdx].Strips); if StrpCnt > 0 then begin SetLength(Tgt.Altns[AltnIdx].Strips, StrpCnt); Tgt.Altns[AltnIdx].Strips := Copy(Src.Altns[AltnIdx].Strips); end; end; end;@suiyunonghen CopyMemory我没有试过,我原来是用Move函数写的复制代码愚见认为Move和CopyMemory均属于内存复制操作,都存在“动态数组部分复制的仅仅是地址”的问题 肯定是你用错了比如赋值你上面的TAlternsvar m: TAlterns; mp: TAlerns;begin setlength(m,20); setlength(mp,20); copyMemory(@m[0],@mp[0], sizeof(SAltern)*20)end;这样不就行了嘛! 权限的授予 如何在StringGrid中间的其中一个格子加个小图标 dbgrideh标题上画控件 可以吗 请教问题? 好久没来了,记得4月份我在这里发过贴。我要到JAVA里头转转了。 高手你来看看! 高分求AUTOMATION 源码 DELPHI中使用那些函数搜索目录中的文件啊?能把这些函数列出来吗?以及给我一个小示例就够了! Help!!关于注册表的问题?在线等! 检测值的改变 从给定范围的连续整数里,随机抽出不重复的N个数字,N由用户自己指定! DELPHI 这是要王者归来的节奏吗?英巴卡迪诺新年战略:支持Linux【提供中文手册】
//SStrips声明
type SStrip = record
JobType : Integer;
UpDst, DnDst : Double;
MchnID : Integer;
BlksVol : SVolAndSpls;
end;
type TStrips = Array of SStrip;
//SAltern声明
type SAltern = record
BlkObjID : Integer;
MchnGrpID : Integer;
Strips : ^TStrips; //这一行是不是该加个指针
Tried : ShortInt;
MachEquiped : Boolean;
ValidNow : Boolean;
Wght : Double;
end;
TAlterns = array of SAltern;
1、动态数组TStrip指定地址SStrips;
2、数组中的每个地址,要创建一个SStrips指针对应。副本变量名为Tgt
1、同样创建动态数组个数与TStrip一致;
2、数组中的每个地址,不要复制指针地址。而是分别创建SStrips实体,保存该变量地址;
3、通过循环语句复制原变量为Src的每个地址的SStrip值。
这样,就是完全复制。
@pathletboy 反射应该是用到RTTI的信息来处理,那样通用性当然好,赶上解释型语言了,但是速度受到字符串处理影响会慢。
所以没采用,但是确实是行之有效的方法
@lyhoo163 谢谢关注,我在多次通用尝试失败后,在通用和速度之间选择了速度。
针对特定的类写的CopyAItem(覆盖基类的CopyAItem方法),无法实现通用性
奉上实现的代码
Tgt^ := Src^;
AltnCnt := Length(Src.Altns);
if AltnCnt > 0 then begin //如果没有数据,其指向是nil不需要处理
SetLength(Tgt.Altns, AltnCnt);
Tgt.Altns := Copy(Src.Altns);
for AltnIdx := 0 to AltnCnt - 1 do begin
StrpCnt := Length(Src.Altns[AltnIdx].Strips);
if StrpCnt > 0 then begin
SetLength(Tgt.Altns[AltnIdx].Strips, StrpCnt);
Tgt.Altns[AltnIdx].Strips := Copy(Src.Altns[AltnIdx].Strips);
end;
end;
end;
@suiyunonghen CopyMemory我没有试过,我原来是用Move函数写的复制代码
愚见认为Move和CopyMemory均属于内存复制操作,都存在“动态数组部分复制的仅仅是地址”的问题
比如赋值你上面的TAlterns
var
m: TAlterns;
mp: TAlerns;
begin
setlength(m,20);
setlength(mp,20);
copyMemory(@m[0],@mp[0], sizeof(SAltern)*20)
end;
这样不就行了嘛!