Entwickler-Ecke
Sonstiges (Delphi) - Probleme mit dem Quellcode
BlueMonk - Mi 13.11.02 17:38
Titel: Probleme mit dem Quellcode
HI!
also, ich hab ein problem in meinem quellcode. jedoch keinen compierfehler, als das programm läuft, nur übersprint er an einer stelle immer ein Readln, könnt ihr mir vielleicht helfen?? hier ist ein teil des quellcode (ist ein programm für die dosconsole).
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46:
| Program 123; uses windows;
{$INCLUDE ConTools.pas}
Var jon, soa : char;
{$APPTYPE CONSOLE}
{Hier stehen verschiedene Prozedurn, die aber nichts mit dem Problem zu tuen haben}
{Hauptprogramm} Begin jon:='n'; Repeat If (jon='n') then begin Spieler_Anzahl; {eine Prozedur} Spieler_Namen; {eine Prozedur} end Else if (jon='j') then begin Repeat Writeln ('Wenn..., dann druecke s'); Writeln ('Wenn..., dann druecke a'); Readln (soa); {HIER IST DER FEHLER: die zeile wird erst beim zweiten durchgang durch die repeat schleife beachtet} ClrScr; If (soa<>'s') and (soa<>'a') then Writeln ('Du darfst nur s oder a eingeben.'); Until (soa='s') or (soa='a'); If (soa='a') then begin Spieler_Anzahl; {eine Prozedur} Spieler_Namen; {eine Prozedur} end; end;
{Hier werden verschiedene Prozeduren aufgerufen, die auch nichts mi dem Fehler zu tuen haben können.}
Repeat Writeln ('Gebe j oder n ein.'); Read (jon); ClrScr; If (jon<>'j') and (jon<>'n') then Writeln ('Du darfst nur j und n eingeben.'); Until (jon='j') or (jon='n'); Until (jon='n'); End. |
Auf dem monitor steht aber:
Du darfst nur s oder a eingeben.
Wenn..., dann druecke s
Wenn..., dann druecke a
d.h. er fragt mich beim ersten readln (soa) gar nicht, was ich eingebe sondern geht direkt weiter. woran kann das liegen?
Keldorn - Mi 13.11.02 20:04
Hallo
Quelltext
1: 2: 3: 4:
| Repeat Writeln ('Gebe j oder n ein.'); Readln (jon); //readln, nicht read ClrScr; |
Mfg Frank
BlueMonk - Mi 13.11.02 20:49
ok, thx, das geht jetzt. kannst du mir bitte auch sagen warum?? weil er geht ja in den if-block rein. ud danach hängt der fortlauf des programms ja nur noch von der anderen variable ab.
Keldorn - Do 14.11.02 08:41
Hallo,
hmm, mit Konsolenanwendungen hab ich in Delphi nie was gemacht, würd mir das ganze aber so erklären:
mit read liest du immer ein zeichen vom Input.
bei 'gebe j oder n ' ein, gibst du 'j' ein,
anschließend in der zweiten repaet schleife (wo dein fehler auftritt) gibst du dann ein a ein,
damit steht im puffer ja.
mit readln liest du nun jedes Zeichen einzeln aus:
1. j -> das ist nicht a oder s, also "Du darfst nur s oder a eingeben"
2. a -> weiter gehts.
wenn du dich schon beim j vertippst, werden dann auch mehrere Fehlermeldungen "Du darfst nur s oder a eingeben" erscheinen
probier mal folgendes:
laß das read(jon)
ändere soa in String
und schreib mal für testzwecke:
readln(soa);
writeln(soa)
dann siehste was ich meine (hoffentlich, habs nich probiert :wink: )
genau wie beim auslesen mit readln aus dateien, setzt readln den "cursor auf die nächste Zeile" oder so ähnlich :wink:
Mfg Frank
Indeterminatus - Do 14.11.02 15:31
Keldorn hat Recht...mit read liest Du nur ein Zeichen aus dem Input-Buffer aus, der allerdings nach Tastendruck nicht gelöscht wird.
Du kannst weiterhin mit read arbeiten, nur musst Du dann vor dem nächsten read den Inputbuffer wieder löschen ...
Ich weiß jetzt ehrlich gesagt nicht, wie das in Delphi funktioniert...
Entweder mit folgender Schleife:
Quelltext
1: 2:
| while ( keypressed ) do read( #irgendeine temporäre variable# ); |
Oder vielleicht gibts auch einen extra Befehl, der den Inputbuffer wieder leert ... müsstest halt in der Hilfe nachschlagen ...
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!