var
  ABuf: array of Byte;
  APacketBuf1: array of Byte;
begin
  SetLength(ABuf, 3);
  ABuf[0] := 10;
  ABuf[1] := 11;
  ABuf[2] := 12;  APacketBuf1 := Copy(ABuf); ***
end;  这样提示***Incompatible typesvar
  ABuf, APacketBuf1: array of Byte;
begin
  SetLength(ABuf, 3);
  ABuf[0] := 10;
  ABuf[1] := 11;
  ABuf[2] := 12;  APacketBuf1 := Copy(ABuf);
end; 这样就正常。 我靠我的本意是这样的;
procedure TForm1.GetPacketBuffer(var APacketBuf: array of Byte);
var
  ABuf: array of Byte;
begin
  SetLength(ABuf, 3);
  ABuf[0] := 10;
  ABuf[1] := 11;
  ABuf[2] := 12;  APacketBuf := Copy(ABuf);
end;给拷贝一份数据到APacketBuf这个动态数组里,可是提示说Incompatible types:'Array' and 'dynamic array';
大伙帮满看啊

解决方案 »

  1.   

    procedure   TForm1.GetPacketBuffer(var   APacketBuf:   array   of   Byte); 
    var 
        ABuf[3]:   array   of   Byte; 
    begin 
        ABuf[0]   :=   10; 
        ABuf[1]   :=   11; 
        ABuf[2]   :=   12;     APacketBuf   :=   Copy(ABuf); 
    end; 
    这样就可以的。
      

  2.   

    首先我要指出一点,还是由于你对语言的基本语法不清楚。
    (1)Pascal是强类型语言,什么叫强类型语言,简单的举个例子,你这么声明
    A:array[0..3] of integer;
    B:array[0..3] of integer;
    A和B就不是赋值兼容的,A:=B无法通过编译。但是你这么声明
    A,B:array[0..3] of integer;
    A和B就是赋值兼容的。
    还可以这么玩
    type 
      MyArray = array[0..3] of integer;var
    A:MyArray;
    B:MyArray;
    A和B就是赋值兼容的
    (2)第二个比较罗嗦一点,数组作为Delphi函数的参数的问题,APacketBuf不是一个动态数组,Delphi中叫开放数组参数,实际上它是一个普通数组,而你的ABuf变量是真正的动态数组,当然赋值不兼容。可能这个不是简单说得清的。请参考《Object Pascal参考手册》和《Delphi 技术手册》
      

  3.   

    type   
        TMyArray   =   array[0..3]   of   integer; function myfun(a:TMyArray):TMyArray;
    var a:TMyArray;
    begin
      result:= a;
    end;//-----------------var a,b:TMyArray;
    b:=myfun(a);
      

  4.   


    可以这样写program Project2;{$APPTYPE CONSOLE}uses
      SysUtils;procedure   GetPacketBuffer2(var   APacketBuf: Pointer; out len: Integer);
    var
        ABuf:   array   of   Byte;
    begin
        SetLength(ABuf,   3);
        ABuf[0]   :=   10;
        ABuf[1]   :=   11;
        ABuf[2]   :=   12;
        len:=length(ABuf);    APacketBuf   :=   Copy(ABuf);
    end;var
      ab: array of byte;
      len: Integer;begin
      try
        GetPacketBuffer2(Pointer(ab),len);
        { TODO -oUser -cConsole Main : Insert code here }
        writeln(ab[0]);
        writeln(ab[1]);
        writeln(ab[2]);
        readln;
      except
        on E:Exception do
          Writeln(E.Classname, ': ', E.Message);
      end;
    end.
      

  5.   


    或者不需要返回长度,用high照样可以取到
    procedure   GetPacketBuffer2(var   APacketBuf: Pointer);
    var
        ABuf:   array   of   Byte;
    begin
        SetLength(ABuf,   3);
        ABuf[0]   :=   10;
        ABuf[1]   :=   11;
        ABuf[2]   :=   12;    APacketBuf   :=   Copy(ABuf);
    end;GetPacketBuffer2(Pointer(ab));
      

  6.   

    像6楼那样用通用指针有时在调用中处理不当会出现堆栈混乱出现异常,其实声明一下类型就可以了type 
        TAarryByte = array of Byte;procedure TForm1.GetPacketBuffer(var APacketBuf: TAarryByte );
    begin
      SetLength(APacketBuf, 3);
      APacketBuf[0] := 10;
      APacketBuf[1] := 11;
      APacketBuf[2] := 12;
    end;
    /----------------------在某个地方就可以像一般变量那样使用了var
       a: TArrayByte;
       TForm1.GetPacketBuffer(a);
      

  7.   


    procedure GetPacketBuffer(var APacketBuf: array of Byte);
    var
      ABuf: array of Byte;
    begin
      SetLength(ABuf, 3);
      ABuf[0] := 10;
      ABuf[1] := 11;
      ABuf[2] := 12;  Move(ABuf[Low(Abuf)], APacketBuf[Low(ABuf)], Length(ABuf));
    end;var
      ABuf: array of Byte;
    begin
      SetLength(ABuf, 3);
      GetPacketBuffer(ABuf);