用中间缓存区交换数据吧。var arrList0:array [0..5] of byte; arrList1:array[0..5] of byte; arrTemp:array[0..5] of byte;//内存复制 fillchar( arrtemp,6,0); move( pbyte(@arrlist0[0])^, pbyte(@arrtemp[0])^, 6); move( pbyte(@arrlist1[0])^, pbyte(@arrlist0[0])^, 6); move( pbyte(@arrtemp[0])^, pbyte(@arrlist1[0])^, 6);
procedure TForm1.hmary(var mary1,mary2:array of string); var mary:array of string; i:Integer; begin SetLength(mary,High(mary1)); for I := 0 to high(mary1)-1 do begin mary[i]:=mary1[i]; mary1[i]:=mary2[i]; mary2[i]:=mary[i]; end; end; 互换过程
改正: for I := 0 to high(mary1) do hight(mary1)不应该减1
注意Delphi是4GL,它的智能程度是很高的,同一类型的数组可以直接赋值,编译器生成代码处理元素复制的问题(也可能只是指针的复制,如果是动态数组的话),不需要用户操心。 注意: type TByteArray10 = array[0..9] of byte; var a1, a2, a3: array[0..9] of byte; // 这是同一类型 a4: array[0..9] of byte; // a5: array[0..9] of byte; // a6: array[0..9] of byte; // 不是同一类型,但是可以用TByteArray10进行cast可以这样直接赋值交换: a3 := a1; a1 := a2; a2 := a3; TByteArray10(a6) := TByteArray10(a4); TByteArray10(a4) := TByteArray10(a5); TByteArray10(a5) := TByteArray10(a6);
动态数组是否也可以这样处理呢 我这样使用报错 [Error] Unit1.pas(131): Invalid typecasttype TArrInt=array of integer;procedure Swap(var x, y:array of integer); var tmp:array of integer; begin TArrInt(tmp):=TArrInt(x); TArrInt(x):=TArrInt(y); TArrInt(y):=TArrInt(tmp);
procedure Swap( x, y:array of integer); type TByteArray10 = array of integer; var a1, a2, a3: array of integer; // 这是同一类型 a4: array of integer; // a5: array of integer; // a6: array of integer; // 不是同一类型,但是可以用TByteArray10进行cast begin //可以这样直接赋值交换: a3 := a1; a1 := a2; a2 := a3; TByteArray10(a6) := TByteArray10(a4); TByteArray10(a4) := TByteArray10(a5); TByteArray10(x) := TByteArray10(a6); //这句编译时报错 : Invalid typecast end;
procedure Swap(var x, y:array of integer);这个声明的x、y的类型不是动态数组,而是open array parameter,这种类型的参数兼容静态数组、动态数组、以[]临时构造的数组,所以x,y的实际类型未必一样。 这样就可以了: type TArrInt=array of integer;
procedure Swap(var x, y: TArrInt); var z: TArrInt; begin z := x; x := y; y := z; end;
为何 这样就能编译procedure TForm1.btn4Click(Sender: TObject); type TByteArray = array of byte; var a1: array of byte; a2: array of byte; a3: array of byte; // a1,a2,a3不是同一类型,但是可以用TByteArray10进行cast begin TByteArray(a3) := TByteArray(a1); TByteArray(a1) := TByteArray(a2); TByteArray(a2) := TByteArray(a3); end 而这样就不能编译procedure Swap2( x, y:array of integer); type TIntegerArr = array of integer; var tmp : array of integer; begin TIntegerArr(tmp):=TIntegerArr(x); TIntegerArr(x):=TIntegerArr(y); TIntegerArr(y):=TIntegerArr(tmp); end;
前面说过了,函数参数中的x, y:array of integer这个声明的x、y的类型不是动态数组,而是open array parameter,虽然形式上看起来象是动态数组(实际上你给它传一个静态数组实参进去也可以的,或者用[]构造一个临时数组也可以)。
arrList0:array [0..5] of byte;
arrList1:array[0..5] of byte;
arrTemp:array[0..5] of byte;//内存复制
fillchar( arrtemp,6,0);
move( pbyte(@arrlist0[0])^, pbyte(@arrtemp[0])^, 6);
move( pbyte(@arrlist1[0])^, pbyte(@arrlist0[0])^, 6);
move( pbyte(@arrtemp[0])^, pbyte(@arrlist1[0])^, 6);
var
mary:array of string;
i:Integer;
begin
SetLength(mary,High(mary1));
for I := 0 to high(mary1)-1 do
begin
mary[i]:=mary1[i];
mary1[i]:=mary2[i];
mary2[i]:=mary[i];
end;
end;
互换过程
注意:
type
TByteArray10 = array[0..9] of byte;
var
a1, a2, a3: array[0..9] of byte; // 这是同一类型
a4: array[0..9] of byte; //
a5: array[0..9] of byte; //
a6: array[0..9] of byte; // 不是同一类型,但是可以用TByteArray10进行cast可以这样直接赋值交换:
a3 := a1;
a1 := a2;
a2 := a3;
TByteArray10(a6) := TByteArray10(a4);
TByteArray10(a4) := TByteArray10(a5);
TByteArray10(a5) := TByteArray10(a6);
我这样使用报错 [Error] Unit1.pas(131): Invalid typecasttype
TArrInt=array of integer;procedure Swap(var x, y:array of integer);
var
tmp:array of integer;
begin
TArrInt(tmp):=TArrInt(x);
TArrInt(x):=TArrInt(y);
TArrInt(y):=TArrInt(tmp);
procedure Swap( x, y:array of integer);
type
TByteArray10 = array of integer;
var
a1, a2, a3: array of integer; // 这是同一类型
a4: array of integer; //
a5: array of integer; //
a6: array of integer; // 不是同一类型,但是可以用TByteArray10进行cast
begin
//可以这样直接赋值交换:
a3 := a1;
a1 := a2;
a2 := a3;
TByteArray10(a6) := TByteArray10(a4);
TByteArray10(a4) := TByteArray10(a5);
TByteArray10(x) := TByteArray10(a6); //这句编译时报错 : Invalid typecast
end;
这样就可以了:
type
TArrInt=array of integer;
procedure Swap(var x, y: TArrInt);
var
z: TArrInt;
begin
z := x;
x := y;
y := z;
end;
为何
这样就能编译procedure TForm1.btn4Click(Sender: TObject);
type
TByteArray = array of byte;
var
a1: array of byte;
a2: array of byte;
a3: array of byte; // a1,a2,a3不是同一类型,但是可以用TByteArray10进行cast
begin
TByteArray(a3) := TByteArray(a1);
TByteArray(a1) := TByteArray(a2);
TByteArray(a2) := TByteArray(a3);
end
而这样就不能编译procedure Swap2( x, y:array of integer);
type
TIntegerArr = array of integer;
var
tmp : array of integer;
begin
TIntegerArr(tmp):=TIntegerArr(x);
TIntegerArr(x):=TIntegerArr(y);
TIntegerArr(y):=TIntegerArr(tmp);
end;
需要实体化以后,才能赋值。
不是没有实体化的问题,
你对比一下这两组代码,
问题是传入的参数为何不能转换为TIntegerArr类型,而函数内的变量就可以转换为TingegerArr类型
open array parameter不能强制转换为下面的自定义类型吗?
type
TIntegerArr = array of integer;
open array parameter不能强制转换为下面的自定义类型吗?
type
TIntegerArr = array of integer;不能,因为open array parameter的实参不只是动态数组。比如传一个动态数组和一个静态数组,二者类型不兼容。