Autor Beitrag
BlueMonk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 17



BeitragVerfasst: Mi 13.11.02 17:38 
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).

ausblenden volle Höhe 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?

_________________
Es irrt der Mensch solange er lebt.
Keldorn
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: Mi 13.11.02 20:04 
Hallo

ausblenden Quelltext
1:
2:
3:
4:
  Repeat
   Writeln ('Gebe j oder n ein.');
   Readln (jon);  //readln, nicht read
   ClrScr;


Mfg Frank
BlueMonk Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 17



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

_________________
Es irrt der Mensch solange er lebt.
Keldorn
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 47



BeitragVerfasst: 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:

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

_________________
_______________________________________
Indeterminatus

---=si tacuisses, philosophus mansisses=---