解决方案 »

  1.   

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

  2.   

    用反射,你这种最好弄成class,因为delphi的反射对class支持的比较好,操作起来会方便不少。
      

  3.   

    原变量为Src
    1、动态数组TStrip指定地址SStrips;
    2、数组中的每个地址,要创建一个SStrips指针对应。副本变量名为Tgt
    1、同样创建动态数组个数与TStrip一致;
    2、数组中的每个地址,不要复制指针地址。而是分别创建SStrips实体,保存该变量地址;
    3、通过循环语句复制原变量为Src的每个地址的SStrip值。
    这样,就是完全复制。 
      

  4.   

    @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均属于内存复制操作,都存在“动态数组部分复制的仅仅是地址”的问题
      

  5.   

    肯定是你用错了
    比如赋值你上面的TAlterns
    var
      m: TAlterns;
      mp: TAlerns;
    begin
      setlength(m,20);
      setlength(mp,20);
      copyMemory(@m[0],@mp[0], sizeof(SAltern)*20)
    end;
    这样不就行了嘛!