![]() |
String länger als 4 KB
Hi all,
ich hab da ein ziemlich fieses Problem: wenn ich in einen String mehr als 4 KB schreib, kommt nur Schrott raus - genauer gesagt die ersten 4096 Zeichen sind okay, der Rest sieht aus wie #0#0#0#0...:?::?::?: hat das schon mal wer gehabt ? |
Re: String länger als 4 KB
Was verstehst du unter "in einen String schreiben"?
|
Re: String länger als 4 KB
Hallo darkstone,
theoretisch solltest Du mehr als 2GB an Daten in einem String fassen können und erfolreich konnte ich mit Strings, deren Länge die 10MB überstieg abeiten. Arbeitest Du direkt mit einem String oder weist Du einer Komponenteneigenschaft Werte zu? Wir erstellst/füllst Du den String? |
Re: String länger als 4 KB
Hallo darkstone,
Zitat:
bye Claus |
Re: String länger als 4 KB
Zitat:
Probier z.B. mal StringOfChar(#0, 8192), dann erhälts du trotzdem eine Länge von 8192 und kannst auf alle Chars zugreifen/sie verändern. Nur die Ausgabe auf dem Bildschirm geht nur bis zur ersten #0 |
Re: String länger als 4 KB
Hallo scp,
das ist mir schon klar. Da aber Delphi standardmäßig mit Huge String arbeitet und auch deshalb in Byte 0 und darunter sich die Länge des Strings merkt. Der String wird aber trotzdem mit einen 0h abgeschlossen. Eine Ausnahme bildet SetLenght. Hier wird einfach nur das Längenbyte geetzt und der Inhalt nach der alten Länge ist undefinert. In obigen Fall wäre es ein Fehler. Ich denke aber, der String ist nach dem ersten auftauchen von #0 zu ende bzw. undefiniert. bye Claus |
Re: String länger als 4 KB
Danke für die schnellen Antworten - zur Klarheit füg ich hier das Code-Schnipsel ein:
Delphi-Quellcode:
Damit wird ein String mit insgesamt 5010 Byte gefüllt - im Debugger seh ich, dass nur die ersten 4096 richtig sind, der Rest ist anscheinend mit #0 aufgefüllt. Allerdings seh ich auch, dass an zufälligen stellen (>4096) auch Methodenbezeichnungen als Teils des Strings stehn (z.B. TForm1.OnActivate).
procedure StrTest;
var i: Integer; aString: String; begin for i:=0 to 500 do begin aString := aString + '0123456789'; end; end; Ich vermute, dass da irgendwo Teile des RAMs überschrieben werden. Nur kann ich beim besten Willen nicht herausfinden, wo der Bug ist. Ich hab auch schon ein komplett neues Projekt erstellt (weil ich dachte, dass vorher irgendwo was schief läuft) - brachte aber das gleiche Ergebnis. Vielleicht kann ja von euch wer Licht in mein Dunkel bringen... |
Re: String länger als 4 KB
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo darkstone,
Zitat:
schau Dir die Demo an bye Claus |
Re: String länger als 4 KB
Du hast die lokale Variable aString nicht initialisiert. Versuche
Delphi-Quellcode:
oder
aString:= '';
Delphi-Quellcode:
Erklärung: Zu einem String werden die Stringdaten selbst, ein Längenwert (Nein, nicht im Byte[0], dann wären ja nur 255 Zeichen möglich) und ein Referenzzähler abgespeichert. Der Ort, wo diese Daten zu finden sind, wird als "Pointer" in der Variable aString abgelegt. Wenn Du Code in der Form
Initialize(aString);
Delphi-Quellcode:
schreibst, wird tatsächlich nur dieser "Pointer" kopiert und der Referenzzähler des Strings inkrementiert.
anotherString:= aString;
In Deinem Fall "zeigte" aString an eine zufällige Stelle, so dass die dort vorhanden Werte interpretiert und verändert worden sind (sehr gefährtlich ;)). Edit: :oops: Habe mir gerade den ASM-Code angesehen: Strings scheinen immer initialisiert zu werden, auch das Kopieren wird in solchen Fällen korrekt abgefangen... |
Re: String länger als 4 KB
Hi,
kann es sein, daß der String in Ordnung ist, und der Debugger nur die ersten 4096 Zeichen korrekt anzeigt? Grüsse Woki |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:06 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