delphi数组问题
生活随笔
收集整理的這篇文章主要介紹了
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);
轉載于:https://www.cnblogs.com/sunlinjun/archive/2009/12/18/1559228.html
總結
以上是生活随笔為你收集整理的delphi数组问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 总结一下F#中运算符的定义规则
- 下一篇: win7无法登录到账户登录失败怎么办啊