Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi String länger als 4 KB (https://www.delphipraxis.net/12194-string-laenger-als-4-kb.html)

darkstone 22. Nov 2003 16:55


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 ?

Luckie 22. Nov 2003 17:00

Re: String länger als 4 KB
 
Was verstehst du unter "in einen String schreiben"?

choose 22. Nov 2003 17:00

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?

Duffy 22. Nov 2003 17:18

Re: String länger als 4 KB
 
Hallo darkstone,
Zitat:

Zitat von darkstone
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 ?

wenn dann nur #0#0#0#0...:?::?::?: kommt ist mit dem ersten #0 der String auch schon zu Ende. Bist Du sicher das Dein String länger ist?

bye
Claus

scp 22. Nov 2003 17:24

Re: String länger als 4 KB
 
Zitat:

Zitat von Duffy
Hallo darkstone,
Zitat:

Zitat von darkstone
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 ?

wenn dann nur #0#0#0#0...:?::?::?: kommt ist mit dem ersten #0 der String auch schon zu Ende. Bist Du sicher das Dein String länger ist?

bye
Claus

Das stimmt nicht ganz, das gilt nur für PChars. Ich arbeite manchmal in nonVCL Progrs mit Strings als Datenpuffer und da sind manchmal ne Menge #0 drin, das klappt allerdings auch mit ner Menge KB (mind. 70-80, mehr hatte ich bis jetzt glaube ich nicht, 2GB sind aber wie gesagt möglich).

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

Duffy 22. Nov 2003 17:47

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

darkstone 22. Nov 2003 17:50

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:
procedure StrTest;
var
  i: Integer;
  aString: String;
begin
  for i:=0 to 500 do begin
    aString := aString + '0123456789';
  end;
end;
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).

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...

Duffy 22. Nov 2003 18:02

Re: String länger als 4 KB
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo darkstone,
Zitat:

Zitat von darkstone
Danke für die schnellen Antworten - zur Klarheit füg ich hier das Code-Schnipsel ein:

Delphi-Quellcode:
procedure StrTest;
var
  i: Integer;
  aString: String;
begin
  for i:=0 to 500 do begin
    aString := aString + '0123456789';
  end;
end;
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).

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...

ich sehe da keinen Fehler ...
schau Dir die Demo an

bye
Claus

choose 22. Nov 2003 18:04

Re: String länger als 4 KB
 
Du hast die lokale Variable aString nicht initialisiert. Versuche
Delphi-Quellcode:
aString:= '';
oder
Delphi-Quellcode:
Initialize(aString);
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
Delphi-Quellcode:
anotherString:= aString;
schreibst, wird tatsächlich nur dieser "Pointer" kopiert und der Referenzzähler des Strings inkrementiert.
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...

woki 22. Nov 2003 18:43

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 01:28 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz