说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

如何复制记录数据?

编辑:说三道四文库 发布时间:2018-05-21 01:43
HTML文档下载 WORD文档下载 PDF文档下载
我有一段代码:
type ta=record
   a:tstringlist;
   b:array of double;
   c:integer;
   end;

var a1,a2:array of ta;

...
a1:=....

现在要复制a1到a2:采用a2:=copy(a1,0,high(a1));

对a2的操作将会影响到a1,因为a1、a2使用同一地址,
如何解决这个问题呢:对a2操作不影响a1?


a2:= a1;//这时引用,对a2的操作将会影响到a1。
//a2:=copy(a1,0,high(a1));
这是数组的完全拷贝啊!应该不会出现对a2的操作将会影响到a1吧?

关注!
Assign
copy没问题的
copy 应该没有问题的,
是不是因为 a: tstringlist; ?
这是一个对象,如果向你所说,我猜可能是 copy 没有重新创建一个 TStringList,
而是将指针指向了它,等下我回去试试看。
昨天回去试了一下,这个问题不太好办,
但要解决应该也可以办到。就是因为记录体内的数据又是一个指针。
是这样的,动态数组本身是一个指针,其大小是动态分配的,
你这个动态数组,是指向一个记录体,而你这个记录体内部,
有两个数据域a 和 b又是一个指针,那么,在复制时,复制
的是这两个指针所在的内存,而这个指针所指向的内存里面的内容
并没有复制,所以,你那样复制a1到a2后,其中的a,b两个域并没有复制,
就出现你说的a2会影响a1,可以定义两个变量,分别是a,b类型的,
a,可以用TStingList.Assign复制对象,对于b,要重新分配内存和原
数组一样大小的内存,应该可以实现。
关注,
帮你up一下,看看谁有好办法!
时间不等人呀。我用最原始的办法,一个一个的复制,即数组内部也一个一个
的复制,好像是:数组用copy,tstringlist用addstrings。
主要是考虑到数组的元素是一个记录体,而记录体内又又动态数组,
动态数组是一个指针,而这个指针指向的又是指针,甚至这个指针还可能
在指向另外一个指针,因此,想完全作到那复制,恐怕很难。
  前几天我也遇到过这种情况,没有想到什么好办法,也是像你这样,
数组内部的元素一个一个复制。
也许没有人再关注这个问题吧。
使用Copy 就可以的!会重新分配内存的!
a2 := a1 两个是一个地址的!
自己可以试试看! 
使用API: CopyMemory
很简单的问题
用循环,一个一个拷
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘