![]() |
Frage zum Aufbau eines Strings
Hi,
meine Frage ist folgende: Warum kann man bei einem String NICHT auf das "0"te Zeichen zugreifen? Was ist darin gespeichert? Mein Lehrer sagte die Länge des Strings. -> Wie kann ich diese Auslesen?? Danke für Erklärungen |
Re: Frage zum Aufbau eines Strings
Also die Länge steht da definitiv nicht.
Dann das 0te Element ist ja nur 1 Byte und in einem Byte könnte man maximal eine Länge von 255 Zeichen vermerken, ein String kann aber bis zu 4 GB groß sein. Aber ungefähr hat dein Lehrer recht, es hat was mit der Längenangabe des Strings zu tun. Delphi hat für Strings eine eigene Speicherverwaltung, deswegen kann es auch wunderschön krachen wenn du zwischen DLL und Hauptprogramm mit String arbeitest (ohne ShareMem) weil dann einfach die Delphieigene Speicherverwaltung nicht ganz stimmt.. Kurz und knapp: ich hab keine Ahnung was dort genau drin steht, aber die Länge wird auf dem einen Byte kaum gespeichert sein. |
Re: Frage zum Aufbau eines Strings
Zu den "255" in einem Byte hast du Recht.
Es könnte ja sein, dass das nicht als Zahl, sondern als Zeichen gespeichert wird. Kurz: String[0]:=Chr(Länge des Strings) Ich dachte, ich hätte das ma irgendwo gesehen :gruebel: vielleicht auch nur geträumt :wink: |
Re: Frage zum Aufbau eines Strings
Hi,
unter Turbo Pascal war in [0] die Länge von Strings gespeichert. Ein String war damals noch in etwa ein array[Byte] of Char ;) Beim Typ "ShortString" von Delphi dürfte das immernoch so sein. Der neue HugeString ("String") hat seine Länge in 4 Bytes gespeichert, an die Du, genauso wie an den Referenzzähler, nicht ohne Umwege rankommst. Da musst Du immer Length() verwenden. Nur noch zur Info ;) : In "String[-8]" steckt der Referenzzähler und in "String[-4]" steckt der Längenzähler. Ich habe das mal in Anführungszeichen gesetzt, weil Du ja nicht so darauf zugreifen kannst :) mfG mirage228 |
Re: Frage zum Aufbau eines Strings
ja eben, wenn es mit "chr(Laenge)" gespeichert wird so kann die Länge höchsens 255 sein. Wenn die Zahl größer ist würde mehr benötigt und somit würde das ganze ja in StringVariable[1] weitergehen was nicht der fall ist.
|
Re: Frage zum Aufbau eines Strings
Zitat:
Angenommen mein String ist "abcdefghij", dann wäre length (10) - 8 ja 2. Und MeinString[2] zeigt ja dann wohl auf eine andere stelle als auf den Referenzzähler. |
Re: Frage zum Aufbau eines Strings
Zitat:
hab mich verschieben. Ich meinte an Position -4 und -8 im String sitzen die beiden besagten Werte, also String[-8] und String[-4] in etwa :) mfG mirage228 |
Re: Frage zum Aufbau eines Strings
Das stößt aber gegen die "unteren Grenzen" eines Strings:
... :=S[-4]; |
Re: Frage zum Aufbau eines Strings
Zitat:
mfG mirage228 |
Re: Frage zum Aufbau eines Strings
Moin!
Das stimmt schon - so wurde es früher gemacht. Die als ShortString bekannten Strings arbeiten immernoch so, daher haben diese eine Beschränkung auf maximal 255 Zeichen und im 0. Zeichen ([0]) steht auch tatsächlich die Länge drin. Und für die heutigen AnsiStrings gilt dies nicht mehr, SirThornberry hat ja schon gut erläutert das man in das Byte keine Längenangabe für 2 GB reinbekommt. Da die Strings aber kompatibel sein sollten so dass die Anwender nicht eine Routine für ShortString und eine für AnsiString schreiben müssen, deshalb gibt es [0] bei AnsiStrings auch noch, nur das hier der Compiler bei einem direktem Zugriff abblockt. Zum Beispiel gibt die Hilfe zu SetLength() an, das sie bei ShortStrings nur das Längenbyte [0] setzt und bei anderen Strings Speicher alloziiert. @SirThornberry: Die Einschränkung mit String und DLL gilt nur für AnsiString, da diese mit internen Referenzen arbeiten - im Gegensatz dazu hat man mit WideStrings oder ShortStrings keine Probleme (keine Referenzen). MfG Muetze1 /EDIT: einmal Pizza aus dem Ofen geholt, schon 5 Posts zu spät... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:52 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