For-Schleife bricht unerwartet ab
-
- Beiträge: 18
- Registriert: Fr 8. Mär 2013, 16:07
- OS, Lazarus, FPC: MINT 21, Laz: 2.2.0, FPC: 3.2.2
- CPU-Target: x64
- Wohnort: Hzgt. Lauenburg
For-Schleife bricht unerwartet ab
Hallo zusammen!
In einem Projekt lese ich in einer For-Schleife die Inhalt eines Memos zilenweise ein und werte die Zeilen nach bestimmten Kriterien aus. Das hat auch bis vor kurzem sauber funktionert. Jetzt ist es so, daß die Schleife immer nach dem 42ten Durchlauf abbricht. Sie wird nicht irgendwo im Code verlassen, sondern der Zähler wird einfach nicht erhöht. Eine zur Kontrolle eigesetzte MessageBox zeigt an, daß die Schleife nach 42 von 1578 Zeilen beendet wurde. Wie bereits gesagt, der Code lief bisher fehlerfrei und wurde auch nicht verändert. Hat jemand eine Idee, wo das Problem liegt?
Lazarus: 1.6.4
FPC: 3.0.2
Win 10 x64
Mfg André
In einem Projekt lese ich in einer For-Schleife die Inhalt eines Memos zilenweise ein und werte die Zeilen nach bestimmten Kriterien aus. Das hat auch bis vor kurzem sauber funktionert. Jetzt ist es so, daß die Schleife immer nach dem 42ten Durchlauf abbricht. Sie wird nicht irgendwo im Code verlassen, sondern der Zähler wird einfach nicht erhöht. Eine zur Kontrolle eigesetzte MessageBox zeigt an, daß die Schleife nach 42 von 1578 Zeilen beendet wurde. Wie bereits gesagt, der Code lief bisher fehlerfrei und wurde auch nicht verändert. Hat jemand eine Idee, wo das Problem liegt?
Lazarus: 1.6.4
FPC: 3.0.2
Win 10 x64
Mfg André
Ein Mensch meint gläubig wie ein Kind, dass alle Menschen Menschen sind. (Eugen Roth)
-
- Lazarusforum e. V.
- Beiträge: 559
- Registriert: So 10. Sep 2006, 23:24
- OS, Lazarus, FPC: Linux Mint 22; Lazarus 3.4 FPC 3.2.2; RaspiOS
- CPU-Target: AMD 64, ARM 64
- Wohnort: nr Stuttgart
Re: For-Schleife bricht unerwartet ab
ohne Code kann dir wohl niemand helfen!
Linux Mint 21.3; Lazarus 3.4 FPC 3.2.2; RaspiOS
-
- Beiträge: 3444
- Registriert: Mo 11. Sep 2006, 10:24
- OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
- CPU-Target: X32 / X64 / ARMv5
- Wohnort: Krefeld
Re: For-Schleife bricht unerwartet ab
"Rauswerfen" in einer For-Schleife geht vermutlich nicht, weil nach dem Rauswerfen sich die Datensätze verschoben haben.
-Michael
-Michael
-
- Lazarusforum e. V.
- Beiträge: 999
- Registriert: Do 17. Apr 2008, 01:59
- OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
- CPU-Target: Intel i7-10750 64Bit
- Wohnort: Freiburg
Re: For-Schleife bricht unerwartet ab
... wenn jetzt meine Glaskugel nicht in Reparatur wäre, würde ich dir helfen
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.
-
- Beiträge: 18
- Registriert: Fr 8. Mär 2013, 16:07
- OS, Lazarus, FPC: MINT 21, Laz: 2.2.0, FPC: 3.2.2
- CPU-Target: x64
- Wohnort: Hzgt. Lauenburg
Re: For-Schleife bricht unerwartet ab
Hallo!
Noch einmal zum Verständnis. Das Programm ist bis vor ein paar Tagen sauber gelaufen und hat das getan, was es soll. Es wurde dann eine weitere Prozedur dem Programm hinzugefügt, die jedoch nichts mit dem betroffenen Programmteil zu tun hat und weder wird aus der neuen Prozedeur zugegriffen noch greift der alte Code auf den neuen zu. Das Problem ist, daß die Schleife bis 42 und dann nicht eben nicht mit 43 weitermacht, sondern die Schleife bendet wird.
http://lazarusforum.de/posting.php?mode ... f73f134a5c#
Noch einmal zum Verständnis. Das Programm ist bis vor ein paar Tagen sauber gelaufen und hat das getan, was es soll. Es wurde dann eine weitere Prozedur dem Programm hinzugefügt, die jedoch nichts mit dem betroffenen Programmteil zu tun hat und weder wird aus der neuen Prozedeur zugegriffen noch greift der alte Code auf den neuen zu. Das Problem ist, daß die Schleife bis 42 und dann nicht eben nicht mit 43 weitermacht, sondern die Schleife bendet wird.

Ein Mensch meint gläubig wie ein Kind, dass alle Menschen Menschen sind. (Eugen Roth)
-
- Beiträge: 61
- Registriert: Di 24. Jan 2012, 11:47
- OS, Lazarus, FPC: Win (L- FPC 2.4.4 + 2.6.4)
- CPU-Target: 32Bit
Re: For-Schleife bricht unerwartet ab
Das
Ändert der neue Code das Memo?
Wurde der Inhalt des Memo (woher auch immer der kommt) geändert.
Wird ggf. eine globale Variable genutzt die auch von dem Code genutzt wird, welches das Memo ausliest.
Hat der Rechner den Anhalter durch die Galaxis gelesen und meint nun er sei Deep Thought (ist nicht ernst gemeint, aber genauso hilfreich)
...
aber raten kannst Du auch.
widerspricht dem:Andrewi hat geschrieben:der Code lief bisher fehlerfrei und wurde auch nicht verändert.
Es wurde ja doch etwas verändert. Wie soll jemand nun aus der Ferne, allein auf Grund der Beschreibung die hier zu finden ist, erraten (und etwas anderes wäre es nicht), was schief läuft. Aber gut raten wir...Andrewi hat geschrieben:Es wurde dann eine weitere Prozedur dem Programm hinzugefügt, die jedoch nichts mit dem betroffenen Programmteil zu tun hat und weder wird aus der neuen Prozedeur zugegriffen noch greift der alte Code auf den neuen zu.
Ändert der neue Code das Memo?
Wurde der Inhalt des Memo (woher auch immer der kommt) geändert.
Wird ggf. eine globale Variable genutzt die auch von dem Code genutzt wird, welches das Memo ausliest.
Hat der Rechner den Anhalter durch die Galaxis gelesen und meint nun er sei Deep Thought (ist nicht ernst gemeint, aber genauso hilfreich)
...
aber raten kannst Du auch.
Würde ich die Dinge so wie alle anderen machen, hätte ich so manche Probleme nicht.
Aber das wäre langweilig.
Aber das wäre langweilig.
Re: For-Schleife bricht unerwartet ab
@andrewi: Wenn du den Code nicht zeigst, kann dir keiner helfen. (Das war auch schon die erste Antwort von Linkat).
Es gibt keine allgemeine, logische Erklärung für etwas, was der Beschreibung nach nicht sein kann.
Selbst wenn du auf einen Compiler Fehler gestoßen sein solltest (in diesem Bereich extrem unwahrscheinlich), kann man ohne Code nichts sagen.
Es gibt keine allgemeine, logische Erklärung für etwas, was der Beschreibung nach nicht sein kann.
Selbst wenn du auf einen Compiler Fehler gestoßen sein solltest (in diesem Bereich extrem unwahrscheinlich), kann man ohne Code nichts sagen.
-
- Beiträge: 18
- Registriert: Fr 8. Mär 2013, 16:07
- OS, Lazarus, FPC: MINT 21, Laz: 2.2.0, FPC: 3.2.2
- CPU-Target: x64
- Wohnort: Hzgt. Lauenburg
Re: For-Schleife bricht unerwartet ab
Hallo zusammen!
Zunächst einmal Danke für eure Hinweise.
Ich hatte war der Meinung, daß ich den Code bereits beim letzten Posting angehängt hätte. War wohl nichts.
Deshalb jetzt der 2. Versuch.
Ich habe inzwischen noch ein bischen experimentiert. Dabei habe ich festgestellt, daß die Schleife auch bei dem folgenden Code nie bis zum Schluß durchlaufen wird. Teilweise wird der gar nicht ausgeführt.
Verwendet wurden verschiedene *.pas und *.txt Dateien. Auch ein neues kleines Projekt mit ausschießlich dem folgenden Code bringt die selben Ergebnisse. Der Text wurde fest in das Memo eingebunden.
Was mich am meisten irritiert, ist die Tatsache, daß der Code lange Zeit einwandfrei funktioniert hat. Die Dateien wurden sauber abgearbeit. Überschneidende globale Variablen kann ich ausschließen, da Form1 die einzige ist.
An einen Fehler im Compiler oder bei Lazarus glaube ich nicht. Ich habe eher das Gefühl, daß das Problem auf meinem Rechner ist. Da ich z.Zt. unterwegs bin kann ich Lazarus momentan nicht neu aufsetzen. Vielleicht hat sich Lazarus oder der Compiler aus welchen Gründen auch immer "verschluckt".
Grüße und Danke an alle
André
Zunächst einmal Danke für eure Hinweise.
Ich hatte war der Meinung, daß ich den Code bereits beim letzten Posting angehängt hätte. War wohl nichts.
Deshalb jetzt der 2. Versuch.
Code: Alles auswählen
procedure TForm1.BitBtn1Click(Sender: TObject);
var
i: ShortInt;
buses,
bvar: boolean;
begin
Memo2.Lines.Clear;
buses := FALSE;
bvar := FALSE;
for i := 0 to Memo1.Lines.Count-1 do {..Count = 1578 # hier bricht die Schleife nach nach 42 Durchläufen ab}
begin
if pos('uses', Memo1.Lines[i]) <> 0 then
buses := TRUE;
if buses and not (Memo1.Lines[i] = '') then
begin
Memo2.Lines.Add(Copy(Memo1.Lines[i],0,Length(Memo1.Lines[i])));
if pos(';',Memo1.Lines[i]) <> 0 then
begin
buses := FALSE;
Memo2.Lines.Add('');
end;
end;
if (pos('var', Memo1.Lines[i]) <> 0) and (Length(Memo1.Lines[i]) = 3)then
bvar := TRUE;
if bvar and not (Memo1.Lines[i] = '') then
begin
Memo2.Lines.Add(Copy(Memo1.Lines[i],0,Length(Memo1.Lines[i])));
if (pos(';',Memo1.Lines[i]) <> 0) and ((Memo1.Lines[i+1] = '') or (Memo1.Lines[i+1] = 'begin')) then
bvar := FALSE;
end;
if pos('* ',Memo1.Lines[i]) = 1 then
begin
Memo2.Lines.Add(Copy(Memo1.Lines[i],Pos('* ',Memo1.Lines[i])+2,(Length(Memo1.Lines[i]))-Pos('* ',Memo1.Lines[i])));
end
else
begin
if (pos('**',Memo1.Lines[i]) <> 0) and (i <> 0) then
begin
Memo2.Lines.Add('');
end;
end;
end;
ShowMessage(IntToStr(i) + ' von ' + IntToStr(Memo1.Lines.Count-1)); {Meldung: 42 von 1578}
ShowMessage('Fertig');
end;
Verwendet wurden verschiedene *.pas und *.txt Dateien. Auch ein neues kleines Projekt mit ausschießlich dem folgenden Code bringt die selben Ergebnisse. Der Text wurde fest in das Memo eingebunden.
Code: Alles auswählen
procedure TForm1.Button1Click(Sender: TObject);
var
i: Shortint;
begin
for i := 0 to Memo1.Lines.Count-1 do
begin
ShowMessage(IntToStr(Memo1.Lines.Count-1));
if i = Memo1.Lines.Count-1 then
ShowMessage(IntToStr(i) + ' von ' + IntToStr(Memo1.Lines.Count-1));
end;
end;
An einen Fehler im Compiler oder bei Lazarus glaube ich nicht. Ich habe eher das Gefühl, daß das Problem auf meinem Rechner ist. Da ich z.Zt. unterwegs bin kann ich Lazarus momentan nicht neu aufsetzen. Vielleicht hat sich Lazarus oder der Compiler aus welchen Gründen auch immer "verschluckt".
Grüße und Danke an alle
André
Zuletzt geändert von m.fuchs am Mi 14. Feb 2018, 15:30, insgesamt 1-mal geändert.
Grund: richtigen Highlighter ausgewählt
Grund: richtigen Highlighter ausgewählt
Ein Mensch meint gläubig wie ein Kind, dass alle Menschen Menschen sind. (Eugen Roth)
Re: For-Schleife bricht unerwartet ab
Warum machst du denn i zu einem ShortInt? Der kann doch nur bis 127. Mache mal übungshalber Range-Checking an (Projekt-Optionen > Debugging > Range)...
-
- Beiträge: 758
- Registriert: Di 23. Aug 2016, 14:25
- OS, Lazarus, FPC: Windows 11
- CPU-Target: 64Bit
- Wohnort: Berlin
Re: For-Schleife bricht unerwartet ab
Dein Wert 1578 dezimal ist in Hex = 0x62A
davon bleibt beim wandeln in ein Byte (siehe wp_xyz) wegen dem Shortint nur noch 2A übrig.
und 2A Hex sind genau deine 42
Wenn das tatsächlich mal funktioniert hat, dann stand da evtl. irgendwo folgende Zeile, dann geht es nämlich wieder...
Type ShortInt = Integer;
Siro
davon bleibt beim wandeln in ein Byte (siehe wp_xyz) wegen dem Shortint nur noch 2A übrig.
und 2A Hex sind genau deine 42
Wenn das tatsächlich mal funktioniert hat, dann stand da evtl. irgendwo folgende Zeile, dann geht es nämlich wieder...
Type ShortInt = Integer;
Siro
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...
-
- Beiträge: 6904
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: For-Schleife bricht unerwartet ab
Was ich mir angewöhnt habe, wen es wichtig ist, wie ein Integer aussieht, dann deklariere ich mit int8, uint8, int16, uint16, etc.
Früher war der gewöhnliche Integer mal 16Bit, heute ist er 32Bit, wer weis, in Zukunft könnte er sogar mal 64Bit werden.
Früher war der gewöhnliche Integer mal 16Bit, heute ist er 32Bit, wer weis, in Zukunft könnte er sogar mal 64Bit werden.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
Re: For-Schleife bricht unerwartet ab
Hoffentlich versteht Andrewi das jetzt nicht so, dass er so eine Schweinerei in seinen Source-Code schreiben soll.siro hat geschrieben:Wenn das tatsächlich mal funktioniert hat, dann stand da evtl. irgendwo folgende Zeile, dann geht es nämlich wieder...
Type ShortInt = Integer;
Generell: Für Wald-und-Wiesen-Integer (Zähler, Laufvariablen, Koordinaten) nehme ich fast immer nur den Datentyp "Integer". Optimierungen der Byte-Größe bringen wegen des Alignment gar nichts, und die Verwendung von vorzeichenlosen Typen (word, etc) - "weil der Wert ja nicht kleiner als 0 sein KANN" - fliegt einem im Debug-Modus um die Ohren, weil man einen Fehlerwert als -1 codiert hat (weil man die vorzeichenlose Deklaration dann nämlich vergessen hat).
-
- Beiträge: 1224
- Registriert: So 20. Mär 2016, 22:14
- OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded
- CPU-Target: Raspberry Pi 3
Re: For-Schleife bricht unerwartet ab
Ist auf Embedded Systemen sinnvoll. Bringt auf dem PC gar nichts. Die Datentypen werden immer auf die 32 oder 64bit des OS erweitert.Mathias hat geschrieben:Was ich mir angewöhnt habe, wen es wichtig ist, wie ein Integer aussieht, dann deklariere ich mit int8, uint8, int16, uint16, etc.
Ist mir mal böse aufgestoßen, als ich eine Rechenroutine für einen Sensor auf dem PC "optimieren" wollte. Da funktionierte das mit int16 wunderbar, auf dem µC dann gar nicht. Ja, der Compiler hat auf dem PC die int16 einfach auf 64bit erweitert und da passten alle Werte locker rein.
-
- Beiträge: 758
- Registriert: Di 23. Aug 2016, 14:25
- OS, Lazarus, FPC: Windows 11
- CPU-Target: 64Bit
- Wohnort: Berlin
Re: For-Schleife bricht unerwartet ab
Ich hoffe, er tut das nicht, das kam mir nur in den Sinn, weil ich mich fragte wie das mal funktioniert haben soll mit einem Shortint.wp_xyz hat geschrieben: Hoffentlich versteht Andrewi das jetzt nicht so, dass er so eine Schweinerei in seinen Source-Code schreiben soll.
Der Fehler hätte doch dann früher auch schon auftreten müssen.
Ich habe mir meine eigenen Datentypen gemacht, sicherlich nicht jedermanns Geschmack,
aber ich kann meinen Code dadurch wesentlich besser lesen und dokumentieren.
Der Ursprung lag aber ursprünglich beim "C" weil ich auch nie wuste wie groß die Datentypen sind.
Der Typ Integer ist zwar in 99 Prozent der Fälle okay, aber es ist ja nie wirklich klar wie groß er nun wirklich ist.
Durch meine Deklarationen sehe ich sofort was gemeint ist.
Code: Alles auswählen
Type U8 = Byte; { unsigned 8 Bit }
Type S8 = ShortInt; { signed 8 Bit }
Type U16 = Word; { unsigned 16 Bit }
Type S16 = SmallInt; { signed 16 Bit }
Type U32 = LongWord; { unsigned 32 Bit }
Type S32 = LongInt; { signed 32 Bit }
Type U64 = QWord; { unsigned 64 Bit }
Type S64 = Int64; { signed 64 Bit }
Type F32 = Single; { Floatingpoint 32 Bit }
Type F64 = Double; { Floatingpoint 64 Bit }
Type BOOL = Boolean;
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...
- m.fuchs
- Lazarusforum e. V.
- Beiträge: 2805
- Registriert: Fr 22. Sep 2006, 19:32
- OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
- CPU-Target: x86, x64, arm
- Wohnort: Berlin
- Kontaktdaten:
Re: For-Schleife bricht unerwartet ab
Senkt aber die Lesbarkeit für andere.siro hat geschrieben:Ich habe mir meine eigenen Datentypen gemacht, sicherlich nicht jedermanns Geschmack,
aber ich kann meinen Code dadurch wesentlich besser lesen und dokumentieren.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de