delphi中两个数组之间如何交换?

程晨c 2014-08-29 10:30:56
delphi中两个数组之间如何交换?

就想下面函数这样

procedure swap(var i,j:integer);
var
i,j,tmp:integer;
begin
tmp:=i;
i:=j;
j:=tmp;
end;
...全文
437 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 16 楼 aniugee 的回复:
[quote=引用 3 楼 dinglinger 的回复:] 用中间缓存区交换数据吧。 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);
觉得3楼的写法比较高效[/quote] 编译器自动生成的复制代码效率比这个高,没有函数调用,你可以看看反汇编的代码。
  • 打赏
  • 举报
回复
引用 15 楼 seleron 的回复:
[quote=引用 12 楼 DelphiGuy 的回复:] 前面说过了,函数参数中的x, y:array of integer这个声明的x、y的类型不是动态数组,而是open array parameter,虽然形式上看起来象是动态数组(实际上你给它传一个静态数组实参进去也可以的,或者用[]构造一个临时数组也可以)。
open array parameter不能强制转换为下面的自定义类型吗? type TIntegerArr = array of integer;[/quote] 不能,因为open array parameter的实参不只是动态数组。比如传一个动态数组和一个静态数组,二者类型不兼容。
aniugee 2014-09-02
  • 打赏
  • 举报
回复
引用 3 楼 dinglinger 的回复:
用中间缓存区交换数据吧。 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);
觉得3楼的写法比较高效
程晨c 2014-09-02
  • 打赏
  • 举报
回复
引用 12 楼 DelphiGuy 的回复:
前面说过了,函数参数中的x, y:array of integer这个声明的x、y的类型不是动态数组,而是open array parameter,虽然形式上看起来象是动态数组(实际上你给它传一个静态数组实参进去也可以的,或者用[]构造一个临时数组也可以)。
open array parameter不能强制转换为下面的自定义类型吗? type TIntegerArr = array of integer;
程晨c 2014-09-01
  • 打赏
  • 举报
回复
引用 10 楼 DelphiGuy 的回复:
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;
程晨c 2014-09-01
  • 打赏
  • 举报
回复
引用 13 楼 lyhoo163 的回复:
TIntegerArr是用户定义的类型,是对象的类型,不是对象的实体。 需要实体化以后,才能赋值。
不是没有实体化的问题, 你对比一下这两组代码, 问题是传入的参数为何不能转换为TIntegerArr类型,而函数内的变量就可以转换为TingegerArr类型
lyhoo163 2014-09-01
  • 打赏
  • 举报
回复
TIntegerArr是用户定义的类型,是对象的类型,不是对象的实体。 需要实体化以后,才能赋值。
  • 打赏
  • 举报
回复
前面说过了,函数参数中的x, y:array of integer这个声明的x、y的类型不是动态数组,而是open array parameter,虽然形式上看起来象是动态数组(实际上你给它传一个静态数组实参进去也可以的,或者用[]构造一个临时数组也可以)。
ptvbs 2014-08-29
  • 打赏
  • 举报
回复
改正: for I := 0 to high(mary1) do hight(mary1)不应该减1
ptvbs 2014-08-29
  • 打赏
  • 举报
回复
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; 互换过程
小呆之家 2014-08-29
  • 打赏
  • 举报
回复
用中间缓存区交换数据吧。 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);
程晨c 2014-08-29
  • 打赏
  • 举报
回复
引用 1 楼 ptvbs 的回复:
还是设一个中间变量数组,循环读取
除了循环,有没有别的方法? 因为要多次交换数组,且数组元素较多, 循环的话速度会慢。
ptvbs 2014-08-29
  • 打赏
  • 举报
回复
还是设一个中间变量数组,循环读取
  • 打赏
  • 举报
回复
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;
程晨c 2014-08-29
  • 打赏
  • 举报
回复

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;
程晨c 2014-08-29
  • 打赏
  • 举报
回复
不能处理传入的参数
程晨c 2014-08-29
  • 打赏
  • 举报
回复
引用 6 楼 DelphiGuy 的回复:
注意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 typecast

type
  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);

  • 打赏
  • 举报
回复
注意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);

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧