定义自定义类型变量 - >复制自定义类型定义数组 - 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

这是在文档解释HTTP:// docwiki。 embarcadero.com/RADStudio/en/Structured_Types#Dynamic_Arrays开始阅读“如果X和Y ...” – 2014-12-07 23:49:36

+0

哦,我现在看到,这是我的第一个想法,但没有对我很有意义。这对所有的,但只有动态数组有效,如果我得到它的权利......? – 2014-12-07 23:54:31

+1

如果你有什么是一个指针,那么这个任务会复制参考。例如,一个赋值不会复制一个类实例。字符串是例外。 – 2014-12-08 00:11:32

在例1中,你通过循环和ba分配每个元素的到相应的插槽。你有两个单独的数组,完全独立的内容。

b[i] := a[i]; 

因此,对每个独立阵列的排序工作,并且事情按照您的意图工作。你可以将它们设置为不同的值,然后检查内容进行验证,以确认他们其实不同:

a[0] := 1; 
b[i] := 2; // Inspecting shows a[0] <> b[0]. 

在例2中,你设置b指向a,这就意味着访问b[1]实际上是访问与a[1]相同的内存位置。你只有一个数组(a),有两个引用(ab)。排序实际上是在一个单一的数组上进行的,所以你所做的只是首先按升序对数组进行排序,然后按降序排列相同的数组(通过第二个参考),而不会得到期望的结果。

您可以通过将重新设置为不同的值,然后检查内容证实了这一点,但是这一次他们将是相同的值:

b := a; 
a[0] := 1; 
b[0] := 2;  // Both a[0] and b[0] now contain the value 2.