2014-12-07 79 views
0

我想知道是否有人可以指出,當使用兩種不同的數組拷貝方法時,會有什麼不同? 。定義自定義類型變量 - >複製自定義類型定義數組 - 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

回答

3

在例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.