AGB  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Memo1.Text.Length erzeugt "Integer Overflow"

Ein Thema von freejay · begonnen am 18. Mai 2017 · letzter Beitrag vom 20. Mai 2017
Antwort Antwort
Seite 1 von 3  1 23   
Foren-Tage 2017
DIE Konferenz für Delphi-Entwickler mit vielen Vorträgen und ganztägigen Workshops, veranstaltet u.A. von der Delphi-PRAXiS und Embarcadero.
21.-23. September 2017 in Hamburg · Mehr Infos unter forentage.de.
freejay

Registriert seit: 26. Mai 2004
Ort: Nürnberg
113 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#1

Memo1.Text.Length erzeugt "Integer Overflow"

  Alt 18. Mai 2017, 15:26
Hallo zusammen,

ich kann in einem Programm (64Bit) massiv Daten in ein TSynMemo schreiben (~ 3 Mio. Zeilen á 50-100 Zeichen) ohne dass ein Fehler auftritt. Der Speicherbedarf des Programms ist dann laut TaskManager bei ca. 3GB.

Versuche ich aber die Anzahl der Zeichen zu bestimmen mit Memo1.Text.Length , dann bekomme ich einen "Integer Overflow"-Fehler.

length(Memo1.Text) funktioniert ebenfalls nicht.

Kann mir jemand sagen warum und/oder wie ich alternativ die Anzahl der Zeichen bestimmen kann (außer über eine Loop über alle Zeilen: Das würde viel zu lange dauern...).

Danke im Voraus!

Freejay
[Delphi 10.1 Berlin; Win7; MySQL]
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
4.911 Beiträge
 
Delphi 10.2 Tokyo Architect
 
#2

AW: Memo1.Text.Length erzeugt "Integer Overflow"

  Alt 18. Mai 2017, 15:36
Was ist mit Memo1.GetTextLen ?
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
4.520 Beiträge
 
Delphi 2010 Professional
 
#3

AW: Memo1.Text.Length erzeugt "Integer Overflow"

  Alt 18. Mai 2017, 15:41
Ganz einfach. Die Anzahl der Zeichen ist über 2^31-1 (2GB), Passt also nicht in einen Integer.
Du musst wahrscheinlich selbst zählen mit nem Cardinal oder Int64.

VIELLEICHT kannst du tricksen und folgendes klappt:
Delphi-Quellcode:
var len: Cardinal;
begin
  len := PCardinal(Cardinal(Memo1.Text)-SizeOf(Cardinal))^
end;
Das ist aber getrickst und ich bin mir nicht sicher, ob das bei so großen Strings klappt.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."

Geändert von Neutral General (18. Mai 2017 um 15:47 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
4.911 Beiträge
 
Delphi 10.2 Tokyo Architect
 
#4

AW: Memo1.Text.Length erzeugt "Integer Overflow"

  Alt 18. Mai 2017, 16:32
Ganz einfach. Die Anzahl der Zeichen ist über 2^31-1 (2GB)
Sicher?
Zitat:
~ 3 Mio. Zeilen á 50-100 Zeichen
sind in etwa 300 Millionen Zeichen, aber noch lange nicht 3000 Millionen.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
4.520 Beiträge
 
Delphi 2010 Professional
 
#5

AW: Memo1.Text.Length erzeugt "Integer Overflow"

  Alt 18. Mai 2017, 16:45
Ganz einfach. Die Anzahl der Zeichen ist über 2^31-1 (2GB)
Sicher?
Zitat:
~ 3 Mio. Zeilen á 50-100 Zeichen
sind in etwa 300 Millionen Zeichen, aber noch lange nicht 3000 Millionen.
Recht hast du Auf der anderen Seite klingt Integer-Overflow aber stark nach einer Länge von über High(Integer).
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
SneakyBagels
(Gast)

n/a Beiträge
 
#6

AW: Memo1.Text.Length erzeugt "Integer Overflow"

  Alt 18. Mai 2017, 16:47
Ich werfe einfach mal was anderes in den Raum.
Ich hatte in einem frischen Projekt auch schon den Integer-Overflow-Fehler... beim Create einer TMemIniFile.
Zwar nicht bei 10.1 sondern bei 10.2.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
4.911 Beiträge
 
Delphi 10.2 Tokyo Architect
 
#7

AW: Memo1.Text.Length erzeugt "Integer Overflow"

  Alt 18. Mai 2017, 16:55
Ich sehe gerade, daß es gar nicht um TMemo sondern um TSynMemo geht. Dann ist mein Vorschlag leider nicht gültig. Allerdings würde dann wohl auch ein simples Debugging zur Quelle des Problems führen.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
5.840 Beiträge
 
Delphi XE4 Professional
 
#8

AW: Memo1.Text.Length erzeugt "Integer Overflow"

  Alt 18. Mai 2017, 17:04
Hallo,
Watchpoint setzen, Wert anzeigen lassen, mit Maxint vergleichen (nicht 4 GB, sondern 2 GB).
Und dann die Sache mit Int64.

Hat das SynMemo keinen Quellcode?
Heiko
  Mit Zitat antworten Zitat
nahpets

Registriert seit: 11. Okt 2006
2.824 Beiträge
 
Delphi 7 Professional
 
#9

AW: Memo1.Text.Length erzeugt "Integer Overflow"

  Alt 18. Mai 2017, 18:35
(außer über eine Loop über alle Zeilen: Das würde viel zu lange dauern...).
SynMemo hat das Attribut Lines. Das ist vom Typ TStrings. Wenn man sich nun anschaut, wie TStrings an den Inhalt von Text kommt, dann stellt man fest, dass in einer Schleife von 0 bis Count - 1 jede Zeile an einen String angehängt wird.
Hier wurde also bereits einmal zum Ermitteln von Text über die alle Zeilen iteriert.
Damit das Ganze funktioniert wird auch für jede Zeile die Länge des Zeileninhaltes ermittelt.

Kann mir nicht vorstellen, dass ein Iterieren über alle Zeilen und das Summieren der jeweiligen Zeilenlänge länger dauert, als eben eine Aufgabe, die genau dies als Teilmenge enthält.

Der Eigenbau hätte hier dann auch noch den Vorteil, dass man für die Summe einen Typen wählen kann, der ausreichend groß ist.

Da die Länge niemals kleiner 0 sein wird, kann man dann auch direkt einen Typen wählen, der nur positive Werte zulässt.

Zitat von Delphi 7-Sourcen zu TStrings:
Delphi-Quellcode:
...
TStrings = class(TPersistent)
...
property Text: string read GetTextStr write SetTextStr;
Einfach mal in die Quellen von function TStrings.GetTextStr: string; schauen. Bei Delphi 7 wird da mit Integer gearbeitet. Reicht das für die hier genutzten Inhalte des SynMemos aus oder kracht es da bereits intern, so dass eine eigene Typauswahl für das Ergebnis von Length nicht für die Fehlerbehebung ausreicht.
Stephan
Weil die Lichtgeschwindigkeit höher als die Schallgeschwindigkeit ist, hält man viele Leute für helle Köpfe, bis man sie reden hört.
  Mit Zitat antworten Zitat
freejay

Registriert seit: 26. Mai 2004
Ort: Nürnberg
113 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#10

AW: Memo1.Text.Length erzeugt "Integer Overflow"

  Alt 18. Mai 2017, 18:47
Danke für die bisherigen Antworten. Kann das erst morgen in der Arbeit testen/verifizieren.

In meinen heutigen Versuchen ist es mir nicht gelungen, an den Quelltext von Length() heranzukommen. Angezeigt wurde, dass Length in Unit System definiert ist, ist es aber nicht (oder ich bin blind...). Ich nahm daher an, dass das so eine compilerinterne Geschichte ist. Vielleicht ist in meinen Debug-Settings irgendwas verqueer...
[Delphi 10.1 Berlin; Win7; MySQL]
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:35 Uhr.
Powered by vBulletin® Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2017 by Daniel R. Wolf