![]() |
AW: Textdatei laden - Integerüberlauf
Leider kann ich mit 10.4 nicht mehr Win64Bit debuggen - es steht immer sofort "disconnected session" - und das war's. Und ein anderes Delphi habe ich grad nicht.
Aber laufen lassen kann ich 64 Bit Programme: Wenn ich zu einer TStringList 50 Mio Mal den string '012345678901234567890123456789' hinzufüge, dann klappt dies. Wenn ich dann savetofile aufrufe, dann gibt's auch hier einen Integerüberlauf. Der von dir erwähnte Integerüberlauf tritt also nicht nur beim Laden, sondern auch beim Speichern auf. |
AW: Textdatei laden - Integerüberlauf
Der 64 Bit-Debugger wird, wie der externe RemoteDebugger, über eine lokale TCP/IP-Verbindung angesprochen ... schau mal ob rmtdbg270.exe lokal freigegeben ist.
So, ansonsten du hast Pech. Im SaveToFile wird erst alles in einen String kopiert und strings können maximal 2 GB groß werden. Bei DynArrays ist Length als NativeInt deklariert, aber bei den LongStrings (z.B. String/UnicodeString) nur als Integer. TStrings.SaveToStream: erst über TStrings.GetTextStr und dann durch TEncoding.GetBytes in ein Byte-Array, welcher in den Stream kopiert wird und der String ist hier die Limitierung. Beim LoadFromFile andersrum. Du darfst gern eine TStringList benutzen, aber nur für Dateien unter 1 GB, oder du implementierts die Lade-/Speichernfunktion selbst. Oder machst es eben "richtig". Zitat:
|
AW: Textdatei laden - Integerüberlauf
Zitat:
Der TE hat nicht geschrieben, was er mit der Textdatei machen möchte. Wenn zur Auswertung der Textdatei wahllos zwischen den Zeilen hin und her gesprungen werden muss, dann bleibt nichts anderes übrig, als die Datei komplett einzulesen. Ausser die Textdatei hat eine feste Zeilenlänge. Aber auch das weist du nicht. |
AW: Textdatei laden - Integerüberlauf
Der TE hat doch schon
![]() |
AW: Textdatei laden - Integerüberlauf
Zitat:
da hier der FileCache von Windows ins Spiel kommt und diese Datei nicht "komplett" im RAM/Auslagerungsdatei abgelegt wird. MemoryMappedFiles Bei sequentiell ist ein StreamReader aber bestimmt einfacher. Wobei, bei der MMF kann man da den Anfang und Ende als PAnsiChar/PWideChar casten und kann gemütlich dazwischen durch den Arbeistspeicher hüpfen, während sich Windows um das Laden kümmert (bzw. Entladen, wenn freier RAM benötigt wird). z.B. der Code oder die Ressourcen von EXE und DLL sind ebenso in den Speicher gemappt, so dass es nicht in die Auslagerungsdatei muß, da es von der Platte geladen und notfalls entladen werden kann. Abgesehn davon wo Code/Speicher/Adressen angepasst wurden, dann wird der Teil von der Datei entkoppelt (CopyOnWrite) und bleibt im RAM/Auslagerungsdatei. |
AW: Textdatei laden - Integerüberlauf
Hallo,
wenn das SaveToFile nicht klappt, dann schreib es per AssignFile, WriteLn (Typ: Text) usw.; |
AW: Textdatei laden - Integerüberlauf
Hallo in die Runde... nur kurz: Ich will gar nicht viele Elemente einer TStringlist speichern. Es war nur eine Bemerkung, dass sowohl das Laden via loadfromfile (ursprüngliches Thema des Threads) wie eben auch das Speichern via savetofile nicht klappt. Grund ist klar (siehe oben).
[ Danke himitsu für deinen 64Bit Win Debugger Firewall Tipp (Einstellung war und ist OK) - wenn ich keine Lösung finde, dann muss ich wohl mal ein neues Thema eröffnen. ] |
AW: Textdatei laden - Integerüberlauf
Zitat:
|
AW: Textdatei laden - Integerüberlauf
Zitat:
|
AW: Textdatei laden - Integerüberlauf
Nur an der Stelle das zu Ändern ist völlig irrelevant, so lange es durch einen String gejagt wird, dann dafür ist hier der Integer als Typ vollkommen richtig, siehe mein Post.
PS, was CodeInsight für Typen beim SetLength anzeigt, ist auch irrelevant, verwirrend und falsch, denn siehe DynArraySetLength in System.pas ist es für dynamische Arrays richtig als NativeInt deklariert, aber eben bei den LongStrings immernoch als Integer. (sowohl Funktion, als auch im Typ) Bezüglich der Compiler-Magic darfst eh nie dem trauen, was dir angezeigt wird. Was extrem schwachsinnig ist, denn in 32 Bit sind seit jeher DynArray und LongString vom Aufbau her rundlegend kompatibel. (auch dort wo seit 2009 die CodePage und CharSize sich verstecken, ist im DynArray ein Platzhalter enthalten), was nun im 64 Bit aber nicht mehr passt. Und das hier auch zu diesem Problem führt. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:11 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 by Thomas Breitkreuz