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 ...