2009-07-13 64 views
8

我在Delphi中有這樣一個基本問題,我無法解決它。如何複製數組?

我的代碼:

注:達諾爾是在下面的方法的地方,但通常它是概念類var.Just它的地方。

class procedure TCelebrity.BeginRead(var input:Array of byte); 
var DataR:Array of byte; 
begin 
    VirtualFree(@DataRead,High(DataRead),MEM_RELEASE); 
    SetLength(DataR,Length(input)); 
    Move(input,DataR,Length(input)); 
end; 

這是編譯的,但在執行Move()之後DataR = nil。

第二個嘗試:

class procedure TCelebrity.BeginRead(var input:Array of byte); 
var DataR:Array of byte; 
begin 
    VirtualFree(@DataRead,High(DataRead),MEM_RELEASE); 
    SetLength(DataR,Length(input)); 
    DataR := Copy(input,0,Length(input)); 
end; 

這並不在all.Error編譯在第三行(達諾爾:=複製(輸入....)說: 「不兼容類型」

在哪裏。 ?!?這個問題他們是字節的所有陣列

回答

7

爲什麼不

SetLength(DataR,Length(input)); 
for i:=Low(input) to High(input) do 
    DataR[i]:=input[i]; 

BTW使用方法:如果你想有數組傳遞作爲參數,你應該聲明它們爲一個類型,例如:

type 
    TMyArray = array of byte; 

並使用TMyArray作爲參數類型。

編輯:我被告知我的價值較低。在我原來的帖子中,它是爲我:= 0,但我:=低(輸入)更安全,更純淨。

+0

我有一個問題。VirtualFree總是返回false,那麼如何釋放DataR中當前使用的mem?注意DataR不是本地的,而是原始代碼中的類var。請提前感謝您的答案! – 2009-07-13 13:14:59

+0

不,你沒有免費的簡單數組。這樣的數組會自動釋放(例如,當你的類被銷燬時)。注意:如果你有一個對象的引用數組,你必須手動釋放這些對象,因爲只有Delphi會釋放數組。 – smok1 2009-07-13 13:29:22

+0

另請注意,SetLenght會重新分配整個數組,因此請避免大量使用此過程。當使用SetLength使陣列變長時,當前內容保持不變,但是,當縮短時,其中一些內容將會丟失。 – smok1 2009-07-13 13:31:32

2

嘗試:

class procedure TCelebrity.BeginRead(var input:Array of byte); 
var DataR:Array of byte; 
begin 
    VirtualFree(@DataRead,High(DataRead),MEM_RELEASE); 
    SetLength(DataR,Length(input)); 
    Move(input[0],DataR,Length(input)); 
end; 
8

試試這個

type 
    TByteDynArray = array of Byte; 

function CopyData(const Input:array of Byte):TByteDynArray; 
begin 
    SetLength(Result, Length(Input)); 
    Move(input[0], Result[0], Length(Input)); 
end; 
1

移動過程不會移動的內存的一部分。它複製計數字節。因此您將得到兩個不同的相同數組:Input和DataR。

procedure CopyData(const Input: Array of Byte); 
var 
    DataR: Array of Byte; 
begin 
    SetLength(DataR, Length(Input)); 
    Move(Input[0], DataR[0], SizeOf(Byte)*Length(Input)); 
end; 

P.s.使用靜態數組,您可以使用SizeOf(Input)而不是SizeOf(Byte)* Length(Input)。 而不是字節可能是其他數據類型。