if-Schleife in while-Schleife löst nur einmal aus

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Sinon
Beiträge: 3
Registriert: Di 5. Nov 2013, 14:22

if-Schleife in while-Schleife löst nur einmal aus

Beitrag von Sinon »

Moin moin, ich schreibe mir hier gerade ein kleines Programm, das 2 Fließtexte mit Waren bzw. deren Preise in Listen verwandelt und dann Waren mit negativen Preisen löschen soll.

Mein Code dafür:

Code: Alles auswählen

 
     text2 := Memo2.Text;
     b := 1;
 
     while length(text2) > 0
     do begin
       p := pos(',', text2);     //Komma suchen im Text
       schnipp := copy(text2, 1, p+2);      //Text bis 2 Stellen hinterm Komma kopieren
       delete(text2, 1, p+2);               //Das Kopierte aus dem Text löschen
       delete(schnipp, pos(' ', schnipp), 1);  //Leerstellen entfernen
       Memo2.Lines[b-1] := schnipp;            //Kopiertes in neue Zeile in Memo einfügen
 
       if pos('-', schnipp) > 0                //Wenn "-" vorhanden
       then begin
       Memo2.Lines.Delete(b-1);                 //Zeile gleich wieder löschen
       Memo1.Lines.Delete(b-1);                 //Parallele Zeile aus Memo1 löschen
       end;
      b := b +1;
     end;
 
Das Seltsame ist: Die if-Schleife wird nur einmal ausgeführt. Der erste negative Wert aus der Liste wird gelöscht, alle danach nicht.

Hab das Problem mittlerweile anders gelöst (Gibt's ne Klapptext-Funktion hier im Forum?):

Code: Alles auswählen

 
text2 := Memo2.Text;
     b := 1;
 
     while length(text2) > 0
     do begin
       p := pos(',', text2);     //Komma suchen im Text
       schnipp := copy(text2, 1, p+2);      //Text bis 2 Stellen hinterm Komma kopieren
       delete(text2, 1, p+2);               //Das Kopierte aus dem Text löschen
       delete(schnipp, pos(' ', schnipp), 1);  //Leerstellen entfernen
 
       if pos('-', schnipp) > 0                //Wenn "-" vorhanden
       then begin
       Memo1.Lines.Delete(b-1);                 //Parallele Zeile aus Memo1 löschen
       end
       else Memo2.Lines[b-1] := schnipp;
      b := b +1;
      end;
 
Aber ich wüsste trotzdem gerne, warum mein erster Ansatz versagt^^

martin_frb
Beiträge: 586
Registriert: Mi 25. Mär 2009, 21:12
OS, Lazarus, FPC: Laz trunk / fpc latest release / Win and other
CPU-Target: mostly 32 bit

Re: if-Schleife in while-Schleife löst nur einmal aus

Beitrag von martin_frb »

Weil de B IMMER um eins erhöhst.

Am Anfang ist Memo2 leer, und b = 1

Memo.Lines[b-1 {0}] := schnip

Wenn du die Zeile nun löscht sind im Memo wieder 0 Zeilen, abr b = 2

Memo.Lines[b-1 {1}] := schnip
setzt nun wieder di erste Zeile, der zu hohe Index wird ignoriert.

Beim löschen zist der Index aber auch zu hoch

Sinon
Beiträge: 3
Registriert: Di 5. Nov 2013, 14:22

Re: if-Schleife in while-Schleife löst nur einmal aus

Beitrag von Sinon »

Ah, ok. Das erklärt auch gleich mein nächstes Problem: Wenn ich Preise unter einem bestimmten Wert löschen will, funktioniert das auch wieder nur manchmal..
Wie gehe ich denn richtig eine solche Liste durch und lösche bestimmte Zeilen, ohne mit dem Index durcheinander zu kommen?
Ich habe versucht, den gelöschten Index durch c := c-1; zu kompensieren, aber das ist ein "Illegal assignment to for-loop variable c" -.-

Nebenfrage:

Code: Alles auswählen

if strtofloat(Memo2.Lines[c]) < 10,00
meckert rum, dass da ein Komma hinter der 10 ist. Hochkommata verwandeln die 10,00 aber in einen Str und er meckert wieder. Wie suche ich nach Kommazahlen? Oder ist das in dem Fall egal?

wp_xyz
Beiträge: 5153
Registriert: Fr 8. Apr 2011, 09:01

Re: if-Schleife in while-Schleife löst nur einmal aus

Beitrag von wp_xyz »

Grundregel für Schleifen beim Löschen: Immer von oben nach unten durchlaufen, da erspart man sich einiges an Kopfzerbrechen mit den Indices, weil die Indices, die nachrücken würden, schon abgearbeitet sind.

"10,00" ist für Lazarus keine Zahl, da gelten nur Dezimalpunkte. Also: 10.00

Sinon
Beiträge: 3
Registriert: Di 5. Nov 2013, 14:22

Re: if-Schleife in while-Schleife löst nur einmal aus

Beitrag von Sinon »

Ha! Hervorragender Tipp! Danke schön!

Damit funktioniert das, wenn ich die letzte Zeile ausklammere, weil die irgendwie immer mit ner Leerzeile gefüllt wird und damit keinen Integerwert hergibt -.-

Weiteres Kuriosum: ich wollte den Counter kontrollieren, indem ich ihn mir in ein weiteres Memo ausgeben lasse. Das war das Ergebnis:
for c := Memo2.Lines.Count-1 downto 0
ergibt mit Memo3.Lines[c] := inttostr(c); folgende Liste:
0
1
21
3
18
5
16
14
8
28
M29
emo38
3


Die Schleife funktioniert, so ist das nicht, aber wie kommen diese Werte zustande??

wp_xyz
Beiträge: 5153
Registriert: Fr 8. Apr 2011, 09:01

Re: if-Schleife in while-Schleife löst nur einmal aus

Beitrag von wp_xyz »

aber wie kommen diese Werte zustande?
Das kann dir niemand sagen, weil du uns nichts sagst, was du reinsteckst. Streiche deinen Code auf das nötigste zusammen und poste hier ein kleines Demoprojekt, das den Fehler zeigt; dann kriegst du sicher gleich gesagt, was falsch ist, aber so ist das nur Herumgerate.

Antworten