Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Problem mit Case in Zählerschleife
Jerk - Fr 08.08.08 15:15
Titel: Problem mit Case in Zählerschleife
Vorweg, mir ist leider kein besserer Titel eingefallen.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| const Operators : Array[0..6] of String = ('+','*','-','/','(',')','^'); ... brO := 0; brC := 0; ... for j := 1 to Length(sLine) do begin Op := False; for i := 0 to 6 do if sLine[j] = Operators[i] then begin Op := true; case i of 4: inc(brO,1); 5: inc(brC,1); end; end; If Op = true then ... end; |
Dieser Schnippsel soll einen String auf Operatoren untersuchen, wenn einer Gefunden wird, soll der Wert OP auf True gesetzt werden. Ist der Operator eine Klammer, dann soll entweder brO oder brC um eins erhöht werden.
Aus irgendeinem Grund, wenn keine Klammer in sLine vorhanden ist, wird brO um 1 erhöht. Wieso? Liegt es am Case ?
Wenn ich z.b. '1+1' als sLine übergebe wird brO auf 1 gesetzt.
Boldar - Fr 08.08.08 16:52
mache es so:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| var Operators : set of char; ... brO := 0; brC := 0; ... operators := ['+','*','-','/','(',')','^']; for j := 1 to Length(sLine) do begin Op := False; if sLine[j] in operators then begin Op := true; case sline[j] of '(': inc(brO); ')': inc(brC); end; end; If Op = true then ... end; |
Jerk - Fr 08.08.08 21:26
Hmm durch das verwenden von set of kann ich ne ganze Menge an sich schon Sparen. Vielen Dank dafür!
GTA-Place - Fr 08.08.08 21:37
Noch hübscher :-P :
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| for j := 1 to Length(sLine) do begin Op := True; case sLine[j] of '(': inc(brO); ')': inc(brC); else Op := False; end;
if Op then end; |
Dann brauchste nicht mal ein Set. Achja, "= True" wird nicht gern gesehen. Leider hat
Luckie den Artikel dazu nicht online (oder ich find ihn nicht).
Jerk - Fr 08.08.08 21:41
Die Variable Op brauche ich garnicht mehr, ich habe es jetzt so gemacht:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| const Operators : set of Char = ['+','*','-','/','(',')','^']; ... if sLine[Step] in Operators then begin if sLine[Step]=')' then inc(brC,1); if sLine[Step]='(' then inc(brO,1); ... end |
Mit dem gleich true meinst du sicherlich sowas oder?
GTA-Place - Fr 08.08.08 21:44
Ja, es kann passieren, dass - obwohl Op scheinbar True ist - die If-Anweisung fehlschlägt, weil True nicht wie von den Entwicklern vorgesehen -1 ist. Wenn du aber nur if Op then schreibst, dann kann nichts passieren :)
Jerk - Fr 08.08.08 21:50
Ja ich dachte jetzt nur rein an die Logik dabei weil es ja irgendwie Doppeltgemoppelt ist.
Vielen Dank aufjedenfall dafür.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!