delphi中两个数组之间如何交换?就想下面函数这样procedure swap(var i,j:integer);
var
  i,j,tmp:integer;
begin
  tmp:=i;
  i:=j;
  j:=tmp;
end;

解决方案 »

  1.   

    用中间缓存区交换数据吧。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);
      

  2.   

    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;
    互换过程
      

  3.   

    改正: for I := 0 to high(mary1) do     hight(mary1)不应该减1
      

  4.   

    注意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);
      

  5.   

    动态数组是否也可以这样处理呢
    我这样使用报错  [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);
      

  6.   


    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;
      

  7.   

    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;
      

  8.   


    为何
    这样就能编译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;
      

  9.   

    前面说过了,函数参数中的x, y:array of integer这个声明的x、y的类型不是动态数组,而是open array parameter,虽然形式上看起来象是动态数组(实际上你给它传一个静态数组实参进去也可以的,或者用[]构造一个临时数组也可以)。
      

  10.   

    TIntegerArr是用户定义的类型,是对象的类型,不是对象的实体。
    需要实体化以后,才能赋值。
      

  11.   


    不是没有实体化的问题,
    你对比一下这两组代码,
    问题是传入的参数为何不能转换为TIntegerArr类型,而函数内的变量就可以转换为TingegerArr类型
      

  12.   


    open array parameter不能强制转换为下面的自定义类型吗?
    type
      TIntegerArr = array of integer;
      

  13.   


    open array parameter不能强制转换为下面的自定义类型吗?
    type
      TIntegerArr = array of integer;不能,因为open array parameter的实参不只是动态数组。比如传一个动态数组和一个静态数组,二者类型不兼容。