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