定义自定义类型变量 - >复制自定义类型定义数组 - Delphi XE3
我想知道是否有人可以指出,当使用两种不同的数组拷贝方法时,会有什么不同? 。定义自定义类型变量 - >复制自定义类型定义数组 - Delphi XE3
我需要做一个函数,可以从动态数组中排序整数元素,从min到max或max到min。因此,创建了一个新类型是这样的:
type IntArray = array of integer;
然后,定义了一个函数来进行排序,具有两个方向,这是由整数识别通过,与参数为0进行排序朝最小(最大 - >分)或1分类为max(min - > max)。
function SortArray(ToSort: IntArray; Direction: integer): IntArray;
var count, i: integer;
Label Label1, Label2;
begin
count:=Length(ToSort);
if (Direction = 1) then
begin
Label1:
for i := 0 to count-2 do
begin
if ToSort[i+1] > ToSort[i] then
begin
ToSort[i+1] :=ToSort[i] +ToSort[i+1];
ToSort[i] :=ToSort[i+1] -ToSort[i];
ToSort[i+1] :=ToSort[i+1] -ToSort[i];
GoTo Label1;
end;
end;
end
else
if (Direction = 0) then
begin
Label2:
for i := 0 to count-2 do
begin
if ToSort[i+1] < ToSort[i] then
begin
ToSort[i+1] :=ToSort[i] +ToSort[i+1];
ToSort[i] :=ToSort[i+1] -ToSort[i];
ToSort[i+1] :=ToSort[i+1] -ToSort[i];
GoTo Label2;
end;
end;
end;
Result:=ToSort;
现在,因为它似乎,但结果不同,关于如何定义传递给函数调用数组此功能工作正常;
我有一个按钮,它给出了函数的两个调用onClick事件:
procedure Button1Click(Sender: TObject);
var a, b: IntArray;
i: Integer;
begin
SetLength(a, 10);
SetLength(b, 10);
for i := 0 to 9 do
begin
a[i]:=Random(100);
b[i]:=a[i]; // Example 1;
end;
// b:=a; // Example 2;
a:=SortArray(a, 1);
b:=SortArray(b, 0);
for i := 0 to 9 do
begin
Listbox1.Items.Add(InttoStr(a[i]));
Listbox2.Items.Add(InttoStr(b[i]));
end;
end;
现在的事情是,如果我定义阵列乙它设置有实施例1的方式, - >的功能正常工作。 A按最大值排序,而B按最小值排序;但是,如果我按照例2提供的方式定义数组B, - >该函数为两个调用提供了相同的结果,两个数组均按最大值排序(如第一次调用中所调用的那样)。
为什么它有什么区别我如何定义数组b,为什么我不应该直接将它作为var复制到var? 似乎并没有多大意义,我在这一点上...
在例1中,你通过循环和b
在a
分配每个元素的值到相应的插槽。你有两个单独的数组,完全独立的内容。
b[i] := a[i];
因此,对每个独立阵列的排序工作,并且事情按照您的意图工作。你可以将它们设置为不同的值,然后检查内容进行验证,以确认他们其实不同:
a[0] := 1;
b[i] := 2; // Inspecting shows a[0] <> b[0].
在例2中,你设置b
指向a
,这就意味着访问b[1]
实际上是访问与a[1]
相同的内存位置。你只有一个数组(a
),有两个引用(a
和b
)。排序实际上是在一个单一的数组上进行的,所以你所做的只是首先按升序对数组进行排序,然后按降序排列相同的数组(通过第二个参考),而不会得到期望的结果。
您可以通过将重新设置为不同的值,然后检查内容证实了这一点,但是这一次他们将是相同的值:
b := a;
a[0] := 1;
b[0] := 2; // Both a[0] and b[0] now contain the value 2.
这是在文档解释HTTP:// docwiki。 embarcadero.com/RADStudio/en/Structured_Types#Dynamic_Arrays开始阅读“如果X和Y ...” – 2014-12-07 23:49:36
哦,我现在看到,这是我的第一个想法,但没有对我很有意义。这对所有的,但只有动态数组有效,如果我得到它的权利......? – 2014-12-07 23:54:31
如果你有什么是一个指针,那么这个任务会复制参考。例如,一个赋值不会复制一个类实例。字符串是例外。 – 2014-12-08 00:11:32