2013-10-28 36 views
2
procedure TForm1.UDPUDPRead(AThread: TIdUDPListenerThread; 
           AData: array of Byte; ABinding: TIdSocketHandle); 
var 
    buffer : TBytes; 
begin 
    SetLength(buffer, Length(AData)); 
    buffer := @AData[0]; 
end; 

此代碼導致訪問衝突。Delphi將字節數組轉換爲TBytes - UDP重定向?

什麼是從陣列字節的轉換爲TB的在Delphi XE3的正確方法?

+0

不應該說'AData'參數屬於'TIdBytes'類型嗎? (['TUDPReadEvent'](http://www.indyproject.org/docsite/html/frames.html?frmname=topic&frmfile=TUDPReadEvent.html)) – TLama

+0

@TLama我認爲這是emba搞砸了 –

回答

3

您需要複製緩衝區。

Count := Length(AData); 
SetLength(buffer, Count); 
if Count <> 0 then 
    Move(AData[0], buffer[0], Length(AData)); 

我有一種感覺,Indy的這部分被Embarcadero搞砸了。注意按值排列的可疑傳遞。如果我記得,回購的Indy版本更好。

+1

[Embarcadero搞砸了XE3](http://www.indyproject.org/Sockets/Blogs/ChangeLog/20120905.EN.aspx)只是因爲他們將'AData'參數從動態數組更改爲開放數組,但這不會更改事實上,wittrup的將數據從一個陣列複製到另一個陣列的代碼剛開始時顯然是錯誤的。所以是的,使用'Move()'來解決這個問題。 –

+0

不是「按價值」,而是不同類型:-) –

+0

@ Arioch'The它確實通過它的價值。還有更多的副本。 –