咨询”包括动态数组的记录(结构体)“的快速复制方法

hapland 2015-01-24 07:41:48
我定义了一个嵌套结构,程序中需要复制操作

//定义部分
//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;


假设原变量为Src,副本变量名为Tgt
我在用Move针对结构的静态空间的进行复制后发现,动态数组部分复制的是地址
即,结构部分复制的是数值,动态数组部分复制的是地址
Tgt的动态数组部分是源数据的引用,而不是副本
因此,当源数据Src释放后,访问Tgt的动态数组已经是垃圾数据

由于我的程序中此类结构众多,如果不能用类似Move这样基础的操作方式复制,就需要针对每个类型写专用复制算法
请问各位大神
有没有什么方法可以快速建立 这种包括动态数组的记录(结构体)的 完全副本
谢谢!!
...全文
369 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
不得闲 2015-01-26
  • 打赏
  • 举报
回复
肯定是你用错了 比如赋值你上面的TAlterns var m: TAlterns; mp: TAlerns; begin setlength(m,20); setlength(mp,20); copyMemory(@m[0],@mp[0], sizeof(SAltern)*20) end; 这样不就行了嘛!
hapland 2015-01-25
  • 打赏
  • 举报
回复
@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均属于内存复制操作,都存在“动态数组部分复制的仅仅是地址”的问题
不得闲 2015-01-25
  • 打赏
  • 举报
回复
CopyMemory就行了!
doloopcn 2015-01-25
  • 打赏
  • 举报
回复
//定义部分 //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;
lyhoo163 2015-01-25
  • 打赏
  • 举报
回复
原变量为Src 1、动态数组TStrip指定地址SStrips; 2、数组中的每个地址,要创建一个SStrips指针对应。 副本变量名为Tgt 1、同样创建动态数组个数与TStrip一致; 2、数组中的每个地址,不要复制指针地址。而是分别创建SStrips实体,保存该变量地址; 3、通过循环语句复制原变量为Src的每个地址的SStrip值。 这样,就是完全复制。
pathletboy 2015-01-25
  • 打赏
  • 举报
回复
用反射,你这种最好弄成class,因为delphi的反射对class支持的比较好,操作起来会方便不少。

16,747

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧