type
Tdata =array [0..3] of byte;
pdata = ^Tdata;
.........
function Myfunc:pdata;
var
data:Pdata;
begin
new(data);
result := data;
end;
function Myfunc:pdata;
var
data:Tdata;
begin
result := @data;
end;
請問,這兩種寫法的回傳值有區別嗎?哪個對?
uj5u.com熱心網友回復:
type
Tdata =array [0..3] of byte;
pdata=https://bbs.csdn.net/topics/^Tdata; // 指向Tdata的指標 型別
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
A:pdata;
implementation
{$R *.dfm}
function Myfunc1:pdata;
var data:Pdata;
begin
new(data);
result := data; // 回傳 指標型別
end;
function Myfunc2:pdata;
var data:Tdata;
begin
result := @data; // 回傳 指向data的指標
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
A:=Myfunc1;
A:=myfunc2;
end;
二者都可以,回傳的都是pdata。
uj5u.com熱心網友回復:
第二種明顯是錯的,把區域變數地址做回傳值.離開函式,區域變數就被回收了.記憶體若么可讀,若么隨機或保持原值.也可能被其他代碼重復使用.
uj5u.com熱心網友回復:
建議用11的寫法標準,版本兼容性好
2的寫法適合D7之類的版本,到了XE會DEBUG到你頭爆
uj5u.com熱心網友回復:
寫法2不論是對哪個版本的Delphi都是不合理的, 因為data是區域變數,它所占用的記憶體在函式退出時就會被釋放掉,這些記憶體隨時都有可能被本身程式或其它程式重新分配。uj5u.com熱心網友回復:
2的寫法是錯了, 原因是臨時變數生存周期只存在于函式內部1的寫法是對的, 但是實際就相當于new, 沒必要設定個臨時變數
function Myfunc1:pdata;
begin
new(Result);
end;
uj5u.com熱心網友回復:
2是典型的錯誤,回傳區域變數的參考或指標。由于Delphi的函式允許回傳任意型別,實際上不必回傳一個指向復雜型別的指標,后者是典型的C方式,可以直接:
function Myfunc: Tdata;
begin
Result[0] := 1;
end;
uj5u.com熱心網友回復:
所以說呢,大多學DEPHI的人對指標涉及不多,但DELPHI對指標的支持和C一樣的,甚至我們可以開一片記憶體人工造一個陣列uj5u.com熱心網友回復:
procedure SetAryHeader(var RevBuffer: Pointer);var
AryLen,MemSize: integer;
begin
if PHeader(RevBuffer)^.X>0 then
begin
AryLen:=PHeader(RevBuffer)^.X;
MemSize:=PHeader(RevBuffer)^.Size; //windows.VirtualAlloc()
MoveMemory(Pointer(DWORD(RevBuffer)+2*S_INTEGER),Pointer(DWORD(RevBuffer)+S_HEADER),MemSize-S_HEADER);
ReallocMem(RevBuffer,MemSize-S_HEADER+2*S_INTEGER);
PDWORD(Pointer(DWORD(RevBuffer)+S_INTEGER))^:=AryLen; //設定動態陣列長度。
RevBuffer:=Pointer(DWORD(RevBuffer)+2*S_INTEGER);
//Dec(PDWORD(RevBuffer),1);
//PDWORD(RevBuffer)^:=0; //參考計數大于0
//Inc(PDWORD(RevBuffer),2);
end
else
begin
FreeMem(RevBuffer);
RevBuffer:=nil;
end;
end;
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/34277.html
標籤:VCL組件開發及應用
上一篇:操作Excel的問題 未設定物件變數或With block變數
下一篇:delphi直接控制plc
