我想直接用CopyMemory直接拷贝两个独立的动态数组,不想用循环,一维的数组可以,二维的就是不行,不知该如何是好。
以下是我的代码:procedure TForm1.Button2Click(Sender: TObject);
var
  A1,A2:array of array of Double;
begin
  SetLength(A1,3,3);
  SetLength(A2,3,3);
  A1[0,0]:=1;
  A1[1,0]:=2;
  A1[2,0]:=3;  A1[0,1]:=4;
  A1[1,1]:=5;
  A1[2,1]:=6;  A1[0,2]:=7;
  A1[1,2]:=8;
  A1[2,2]:=9;  //CopyMemory(A2,A1,9*SizeOf(Double));这一句好象可以,但发现A2,A1不独立
  
  CopyMemory(@A2[0,0],@A1[0,0],9*SizeOf(Double)); 
  //这一句好象等同于CopyMemory(@A2[0,0],@A1[0,0],3*SizeOf(Double)); 只拷贝了一部分  //只能采用以下几句,通过,但是太繁琐了,能不能一句话实现呢?
  //CopyMemory(@A2[0,0],@A1[0,0],3*SizeOf(Double));
  //CopyMemory(@A2[1,0],@A1[1,0],3*SizeOf(Double));
  //CopyMemory(@A2[2,0],@A1[2,0],9*SizeOf(Double));  //A2[0,0]:=11;
  //A2[1,0]:=12;
  //A2[2,0]:=13;  //A2[0,1]:=14;
  //A2[1,1]:=15;
  //A2[2,1]:=16;  //A2[0,2]:=17;
  //A2[1,2]:=18;
  //A2[2,2]:=19;  Label1.Caption:=floattostr(A2[0,0]);
  Label2.Caption:=floattostr(A2[1,0]);
  Label3.Caption:=floattostr(A2[2,0]);  Label4.Caption:=floattostr(A2[0,1]);
  Label5.Caption:=floattostr(A2[1,1]);
  Label6.Caption:=floattostr(A2[2,1]);  Label7.Caption:=floattostr(A2[0,2]);
  Label8.Caption:=floattostr(A2[1,2]);
  Label9.Caption:=floattostr(A2[2,2]);
end;

解决方案 »

  1.   

    只要改这句
    CopyMemory(@A2[0,0],@A1[0,0],9*2*4);
      

  2.   

    跟踪了一下,发现二维数组中行跟行之间的地址不是连续的,只有同一行中的是连续的,
    如@A1[0,0]、@A1[0,1]、@A1[0,2]是连续的,但接下来的@A1[1,0]并不是接着@A1[0,2],
    所以只能一行行CopyMemory了。
      

  3.   

    不过有别方法可以实现,就是太复杂了,如果就是3维固定的话就这样吧。
    如果不是维数固定的话可以先的到a1的地址(注:动态数组a1与a1[0,0]的地址是不同的)
    从这个地址读取一个地址,该指针指向一个地址数组的地址,该数组以1E000000结尾。
    地址数组的每一个地址就是每一维数组的地址。
    通过获得这些地址就代入CopyMemory就可以拷贝对应维的数组。
      

  4.   

    不过有别方法可以实现,就是太复杂了,如果就是3维固定的话就这样吧。
    如果不是维数固定的话可以先的到a1的地址(注:动态数组a1与a1[0,0]的地址是不同的)
    从这个地址读取一个地址,该地址是一个地址数组的地址,该数组以1E000000结尾。
    地址数组的每一个地址就是每一维数组的地址。
    通过获得这些地址就代入CopyMemory就可以拷贝对应维的数组。