我有一段代码:
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?
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:=copy(a1,0,high(a1));
这是数组的完全拷贝啊!应该不会出现对a2的操作将会影响到a1吧?关注!
是不是因为 a: tstringlist; ?
这是一个对象,如果向你所说,我猜可能是 copy 没有重新创建一个 TStringList,
而是将指针指向了它,等下我回去试试看。
但要解决应该也可以办到。就是因为记录体内的数据又是一个指针。
是这样的,动态数组本身是一个指针,其大小是动态分配的,
你这个动态数组,是指向一个记录体,而你这个记录体内部,
有两个数据域a 和 b又是一个指针,那么,在复制时,复制
的是这两个指针所在的内存,而这个指针所指向的内存里面的内容
并没有复制,所以,你那样复制a1到a2后,其中的a,b两个域并没有复制,
就出现你说的a2会影响a1,可以定义两个变量,分别是a,b类型的,
a,可以用TStingList.Assign复制对象,对于b,要重新分配内存和原
数组一样大小的内存,应该可以实现。
的复制,好像是:数组用copy,tstringlist用addstrings。
a2 := a1 两个是一个地址的!
自己可以试试看!