Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Stream auslesen (https://www.delphipraxis.net/62801-stream-auslesen.html)

PASST 10. Feb 2006 08:13

Re: Stream auslesen
 
Ok und vielen Dank, ich habe es verstanden.

Ich versuch's mal in eigene Worte zu fassen.
Delphi-Quellcode:
LString := '123456';
Der Compiler weiß bevor er LString den String '123546' zuweist, dass der Text 6 Byte lang ist, und setzt SetLength(s, 6) automatisch vorher.
Delphi-Quellcode:
LBytes := AStream.Read(LString[1], 50);
Read bedeutet, dass munter 50 Bytes in die Variable LString gelesen werden sollen und erst nachher festgestellt wird, wieviel Bytes tatsächlich gelesen wurden. Ergo hat der Compiler gar nicht die Möglichkeit im Vorhinein SetLength aufzurufen.

Noch eine letzte Frage. Was bedeutet [1] bei LString[1] genau?
Meine Vermutung ist, da wir die ganze Zeit von Speicheradressierung sprechen, dass hiermit die erste Speicheradresse, die für LString reserviert wurde, gemeint ist. Wenn ich also LString[10] schreibe, würde in den ersten 9 Bytes der für LString reservierten Speicheradressen ein zufälliger Inhalt stehen. Richtig?

Aga aga aga, einen habe ich noch:
Delphi-Quellcode:
Integer(Buffer) := 5;
Pinteger(@Buffer)^:= 5;
Beides ist mir unbekannt und kann ich so über die Hilfe auch nicht nachvollziehen. Wann darf ich sowas überhaupt anwenden?

Christian Seehase 10. Feb 2006 20:21

Re: Stream auslesen
 
Moin PASST,

Zitat:

Zitat von PASST
Noch eine letzte Frage. Was bedeutet [1] bei LString[1] genau?

Zitat:

Zitat von PASST
Meine Vermutung ist, da wir die ganze Zeit von Speicheradressierung sprechen, dass hiermit die erste Speicheradresse, die für LString reserviert wurde, gemeint ist. Wenn ich also LString[10] schreibe, würde in den ersten 9 Bytes der für LString reservierten Speicheradressen ein zufälliger Inhalt stehen. Richtig?

Zitat:

Zitat von PASST
Ok und vielen Dank, ich habe es verstanden.

Sieht so aus, denn Deine Vermutung trifft's genau.
Du musst dann halt nur berücksichtigen, dass Du, um im obigen Beispiel zu bleiben, auch nur noch 41 Byte lesen darfst, statt 50.

[EDIT]
Wobei noch anzumerken wäre, dass der Compiler intern einen String immer mit #0 abschliesst, also ein Byte mehr belegt, als length zurückliefert, damit man diese an C-Funktionen (die i.d.R. Nullterminierte Strings verwenden) übergeben kann, ohne sich um die abschliessende #0 kümmern zu müssen. Das ist dann speziell bei Aufrufen von Funktionen der Windows-API wichtig.
[/EDIT]


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:02 Uhr.
Seite 2 von 2     12   

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