![]() |
Cast Array[0..x] of Byte in TBytes
Hi!
Ich möchte gerne mit TIdTCPServer Daten an den Client schicken. Über
Delphi-Quellcode:
Kann ich TBytes an den Client schicken.
AContext.Connection.IOHandler.Write(Buffer, len);
Ich habe aber nun Buffer als Array[0..1023] of Byte; Nun will Write den Buffer nicht mehr. Und extra immer ein TBytes Array mit Setlength zu setzen, dann die Daten kopieren und diese dann zu schicken ist etwas umständlich. Wie kann man das richtig Casten damit es keine Probleme gibt? |
AW: Cast Array[0..x] of Byte in TBytes
Zitat:
|
AW: Cast Array[0..x] of Byte in TBytes
Ok, danke!
So gibt es zumindest keinen Crash:
Delphi-Quellcode:
Man spart sich das Memcopy.
var
_buffer : TBytes; buffer : Array[0..1023] of Byte; begin SetLength(_buffer, Length(buffer)); _buffer := @buffer[0]; |
AW: Cast Array[0..x] of Byte in TBytes
Das kann nicht richtig sein.
Du verlierst den Zeiger auf den dynamisch reservierten Speicher (_buffer). Es sollte ein Speicherleck geben und fast eine Zugriffsverletzung, wenn _buffer irgendwann freigegeben werden soll und buffer kein gültiger Zeiger mehr ist. |
AW: Cast Array[0..x] of Byte in TBytes
Zitat:
|
AW: Cast Array[0..x] of Byte in TBytes
Zitat:
Durch den Umstand, daß die Write-Methode den Parameter ABuffer als Konstante erwartet, wird vom Compiler nur die Anfangsadresse des Arrays übergeben. Und damit ist es völlig egal, ob es sich dabei um den Beginn eines dynamischen oder eines statischen Arrays handelt. Ein kleines Beispiel:
Delphi-Quellcode:
Das heißt: Ein Typecast ist sehr wohl möglich. Ob er auch sinnvoll ist, steht auf einem ganz anderen Blatt... :wink:
procedure Test(const ABuffer: TBytes; ALength: Integer);
var n: Integer; s: String; begin s:=''; for n:=0 to ALength-1 do begin if s<>'' then s:=s+','; s:=s+IntToStr(ABuffer[n]); end; ShowMessage(s); end; procedure TForm1.Button1Click(Sender: TObject); var n: Integer; a: array[0..9] of Byte; b: TBytes; begin //dynamisches Array: SetLength(b,10); for n:=Low(b) to High(b) do b[n]:=n; Test(b,10); //statisches Array: for n:=Low(a) to High(a) do a[n]:=n; Test(TBytes(@a[0]),10); //<- Typecast end; |
AW: Cast Array[0..x] of Byte in TBytes
Nur zum Beruhigen: ich habe es so eh nicht umgesetzt!
Bei meinen Versuchen war das die einzige Methode wo es keinen Memory Fehler gab :oops: |
AW: Cast Array[0..x] of Byte in TBytes
@schwa266: Sowas hat jeder mal versucht, besonders wenn man die Verwandschaft (und Compiler-Unterstützung) von String und PChar kennt, will man das gerne mal auf andere Bereiche übertragen.
Zitat:
Delphi-Quellcode:
"From 0 To <Random>"
procedure Test(ABuffer: TBytes; ALength: Integer);
var n: Integer; s: String; begin ShowMessage(Format('From %d To %d', [Low(ABuffer), High(ABuffer)])); Wie das Beispiel zeigt ist der Typecast nicht korrekt und nur im begrenzten Fall problemlos. |
AW: Cast Array[0..x] of Byte in TBytes
@Satty67:
Ich hatte auf die Behauptung von Uwe Raabe reagiert - nicht auf Deine. Und es ging bei der Frage des Threaderstellers darum, ob es in dem konkteren Fall möglich ist. Noch einmal ausführlich für Dich, was ich mit meiner Bemerkung gemeint hatte: Selbstverständlich ist es eine bekannte Tatsache, daß ein Pointer ein Pointer bleibt und der Typecast nur ein (unsauberes) Mittel ist, um den Compiler dazu zu bringen, seine Arbeit ohne Fehlermitteilung fortzusetzen. Man muß also sehr genau wissen, was man tut und sich überlegen, welche Delphi-Funktionen mit dem gecasteten Pointer eingesetzt werden können. Genau aus diesem Grund hatte ich geschrieben, daß man sich die Frage stellen sollte, ob ein Cast sinnvoll ist - also ob er das gewünschte Ergebnis liefert. Geht es zum Beispiel um eine hohe Geschwindigkeit, wäre das ständige Kopieren von Puffern kontraproduktiv. Natürlich wäre es günstiger - falls möglich - , das statische Array gleich durch ein dynamisches Array zu ersetzten und damit potentiellen Problemen aus dem Weg zu gehen. Hatte ich an irgend einer Stelle behauptet, daß ein derartiger Cast immer und in jedem Fall sinnvoll ist? Ich kann mich nicht daran erinnern. Es ist also von Dir absolut überflüssig, in einer derart belehrenden Art und Weise zu schreiben und andere für dumm zu halten. Aber das scheint hier im Forum leider eine weit verbreitete Unsitte zu sein. Da wird nicht auf konkrete Fragen geantwortet sondern lieber aus - nahezu - jedem Thread eine Prizipiendiskussion gemacht, um sich selbst zu profilieren. Sehr bezeichnend und sehr bedauerlich. |
AW: Cast Array[0..x] of Byte in TBytes
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Das tatsächliche Speicherlayout kann man ![]() Beiliegendes Projekt zeigt das ganz deutlich - und es crasht auch beim Beenden. Insofern bleibe ich bei meiner Aussage, daß das Speicherlayout unterschiedlich ist. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:23 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz