我想知道是否有人可以指出在使用数组的两种不同复制方法时会有什么不同,数组被定义为类型。
我需要创建一个函数来对动态数组中的整数元素进行排序,从min到max或max到min。因此,我创建了一个这样的新类型:
type IntArray = array of integer;
然后我定义了一个函数来排序,有两个方向,通过整数传递标识,参数为0以排序为最小值(max - > min)或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的方式定义数组B, - &gt;功能正常。 A按最大值排序,而B按最小值排序;
但是,如果我按照示例2的方式定义数组B, - &gt;该函数为两个调用提供了相同的结果,两个数组都被排序为最大值(在第一次调用中调用)。
为什么我定义数组b的方式有所不同,为什么我不能直接将它作为var复制到var? 在这一点上对我来说似乎没什么意义......
答案 0 :(得分:3)
在示例1中,您循环并将a
中每个元素的值分配到b
中的相应广告位。你有两个独立的数组,内容完全独立。
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.