delphi数组问题



最近一直为数组的问题困绕。数组的值老是传不对。

procedure sendData(cosnt buf;len:integer);
var
   buffer:array of byte;
begin
   move(buf,buffer,len);//这里buffer没有正常将buf的值赋过来
   //.... 
end;


经过研究发现是由于静态数组和动态数组,指针的指向是不一样的。 string类型也是动态数组。
如下例子。

静态数组
procedure   TForm1.Button1Click(Sender:   TObject);  
  var  
      a:Array[0..10]   of   integer;  
      b,c:pointer;  
  begin  
      b:=@a;  
      c:=@(a[0]);  
      showmessage(inttostr(integer(b))+'   '+inttostr(integer(c)));         --相等
  end;


procedure   TForm1.Button2Click(Sender:   TObject);  
  var  
      a:array   of   integer;  
      b,c:pointer;  
  begin  
      setlength(a,10);  
      b:=@a;  
      c:=@(a[0]);  
      showmessage(inttostr(integer(b))+'   '+inttostr(integer(c)));    --不相等
 
      b:=a;  
      c:=@(a[0]);  
      showmessage(inttostr(integer(b))+'   '+inttostr(integer(c)));    --相等
  end;

这两个例子可以说明。动态数组的变量名,不等于第1个数组,它是一个地址.
静态数组名等于第1个数组


所以在使用Move这个函数时,它取了source和Dest的地址进行赋值操作,如下:
procedure       Move( const Source; var Dest; count : Integer );
{$IFDEF PUREPASCAL}
var
  S, D: PChar;
  I: Integer;
begin
  S := PChar(@Source);
  D := PChar(@Dest);
  if S = D then Exit;
  if Cardinal(D) > Cardinal(S) then
    for I := count-1 downto 0 do
      D[I] := S[I]
  else
    for I := 0 to count-1 do
      D[I] := S[I];
end;

动态数组应该如下传值
var
   buffer:array of byte;
begin
   move(buf,buffer[0],len);


静态数组应该如下传值
var
   buffer:array of byte;
begin
   move(buf,buffer,len);
posted @ 2009-12-18 12:02  老二  阅读(375)  评论(0编辑  收藏  举报