Computerhilfen.de Logo
Forum
Tipps
News
Frage stellen

Pascalproblem mit Schleife

Hi!

Also ich hab folgendes Problem. Ich versuche einen Reaktionstester zu schreiben, aber es funktioniert nicht richtig. Das compilieren funktioniert vollkommen fehlerfrei. Aber beim Programmablauf gibt es dann einen Fehler...

Hier ist der Programmtext:

Zitat
program Reaktionstest;

uses CRT;

var a: integer;

BEGIN
  clrscr;
  randomize;
  writeln;
  writeln('Reaktionstest by [SDE]TheFrozenOne');
  writeln;
  writeln('Beschreibung:');
  writeln('Der Test startet, sobald sie Enter drcken.');
  write('Sobald dann ');
    textcolor(lightred);
      write('!!STOP!!');
    textcolor(lightgray);
  write(' aufleuchtet, drcken sie wieder Enter.');
  writeln;
  writeln('Beginnen Sie den Test mit Enter');
  readln;
  delay(random(10000)+2000);
  textcolor(lightred);
    writeln('!!STOP!!');
  textcolor(lightgray);
  writeln;
  a:=0;
  while not keypressed do
    begin
      a:=a+1
    end;

    writeln;
    writeln('Deine Reaktionszeit betr„gt ',a,'ms');
    writeln;
    writeln('Beenden mit Enter');
    readln;
END.

Der Fehler muss irgendwo im markierten Bereich liegen, denn da bricht das Programm mit einer Fehlermeldung ab.

Vielen Dank für Eure Hilfe schonmal im Voraus...

MfG

[SDE]TheFrozenOne
 

Antworten zu Pascalproblem mit Schleife:

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Was kommt denn da fuer ne Fehlermeldung?

Also ich programmiere ja mit FPC und dann kommt immer folgende Meldung...



Wenn ich das Programm so starte, also nicht über [Strg]+[F9], dann zeigt er keine Meldung, sondern beendet das Prog einfach nur...

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Na das ist doch schon mal ein Anfang.
Exitcode 201: Range check error If you compiled your program with range checking on, then you can get this error in the following cases:
1. An array was accessed with an index outside its declared range.
2. Trying to assign a value to a variable outside its range (for instance a enumerated type).

Ich vermute mal, dass die Variable a zu klein ist. Du hast ja ne Schleife, wo die kontinuierlich hochgezaehlt wird. Du schreibst da zwar was von ms, aber das ist natuerlich Bloedsinn, es wird viel schneller gezaehlt. Und wenn ein int (wie ich hier vermute) nur 16bit lang ist, laeufst du da ganz fix raus.
 

a:=a+(a+1)
ein Versuch wert.
 

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button
a:=a+(a+1)
Nee, nicht wirklich. Dadurch geht es nur noch schneller. Die sinnvollste Lösung ist ein Timer, d.h. man merkt sich die Zeit wenns losgeht und die Zeit wenn der Button gedrückt wird. Daraus kann man dann wirklich die Reaktionszeit berechnen (vorausgesetzt der Timer hat ne angemessene Auflösung). Also z.B. mit der Funktionalität aus rtl.dateutils 

@Lisaas 2. Beitrag:

Stimmt... Ich hab nicht dran gedacht... Der zählt ja nicht die ms, sondern die Takte des Prozessors, richtig?

@Lisaas 3. Beitrag:

Hmm.... was ist denn rtl.dateutils?

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button
Stimmt... Ich hab nicht dran gedacht... Der zählt ja nicht die ms, sondern die Takte des Prozessors, richtig?
Wahrscheinlich auch nicht ganz, ist aber naeher dran als an ms.

Zitat
Hmm.... was ist denn rtl.dateutils?
Das ist eine Bibliothek (Pascal Unit .ppu), die Datums- und Zeitoperationen zur Verfuegung stellt. Damit sollte man nen Timer recht einfach hinkriegen. Koennte bei FPC schon dabei sein.
Doku dazu gibts hier:
http://www.freepascal.org/docs-html/rtl/dateutils/index-5.html
Fuer dich koennte da insbesondere die MilliSecondsBetween-Funktion interessant sein.
« Letzte Änderung: 01.02.08, 08:20:08 von Lisaa »

Okay, danke...

Hab mir das, also dieses MilliSecondsBetween, durchgelesen. Auch das Beispiel. Aber trotzdem kapier ich das nicht... ???

"TimeToStr"... Was ist das?

Kann mir da jemand helfen, und mir sagen, wie ich das in das Programm einbinden kann?

Wäre nett von euch...  :D

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Ich probiers mal:

PROGRAM Reaktionstest;

USES CRT, SysUtils, DateUtils;

VAR
    t1, t2: TDateTime;

BEGIN
    [...]

    writeln('Beginnen Sie den Test mit Enter');
    readln;
    t1:=Now;

    delay(random(10000)+2000);
    textcolor(lightred);
    writeln('!!STOP!!');
    textcolor(lightgray);
    writeln;

    while not keypressed do
    begin
    end;
    t2:=Now;   

    writeln;
    writeln( 'Deine Reaktionszeit betraegt ', MilliSecondsBetween( t1, t2 ), 'ms' );
    writeln;
    writeln( 'Beenden mit Enter' );
    readln;
END.
Ich gebe keine Garantie, dass das so geht (Meine letzten Pascal-Erfahrungen sind ~10 Jahre her)...

Okay, das Compilieren funktioniert soweit ganz gut. Nur habe ich immer noch das gleiche Problem. Nur ohne Fehlermeldung.

Da wo eigentlich die Auswertung folgen sollte beendet er das Programm einfach. Als wäre hinter "t2:=Now;" nichts mehr...

Ich könnt heulen...  :'(

kommt nicht für die while, auch noch ne Repeat schleife rein?
würde es auch gern verstehn!
while/to do/Repeat/Until/End

« Letzte Änderung: 01.02.08, 18:48:46 von copy »

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Die Frage versteh ich jetzt nicht so ganz. Sinn der while-Schleife hier ist, dass praktisch auf einen Tastendruck gewartet wird; d.h. es wird so lange durch die leere Schleife geeiert und nichts gemacht.
Kann man sicherlich auch eleganter lösen. Weiss aber gerade nicht wie, da ich nicht gerade der Pascal-King bin.

ja, ich leider auch nicht!, deswegen die Beteidigung (wenns nicht stört).
..die while schleife läuft doch soviel, ich weiß nur einmal, durch und wartet dann auf Anweisung, desswegen dachte ich, man müßte, noch ne, Repeat schleife einfügen.

Zitat: übrigens, bekomme ich mein TurboPascal auf meinem neuen Rechner, überhaupt nicht ans laufen (Division : O),
wie macht ihr das??

« Letzte Änderung: 01.02.08, 19:37:40 von copy »

Nein. Ich denke nicht. Also es gibt ja 3 Schleifen:
1. For (Zählschleife)
2. While (Kopfgesteuert)
3. Repeat (Fußgesteuert)

While und For sind Schleifen, die erst die Bedingung abfragen und dann ausführen. z.B.:

for i:=1 to 7 do [...]

Das Programm soll solange etwas ausführen, bis i=7 ist...

Dazu prüft er vor der Ausführung, ob i schon 7 ist. Wenn nich, führt er aus, ansonsten läuft das Programm weiter...

Bei der fußgesteuerten Repeat-Schleife, führt er erst aus, und kontrolliert dann die Bedingung.

Dürfte eigentlich erklärend genug gewesen sein, oder ich hab deinen Ansatz mit der Repeat- und While-Schleife nicht verstanden...

Jedenfalls reicht eine Schleife aus. Ich glaube, mit der For-Schleife kann man mein Problem auch lösen, aber ich denke meine While-Lösung bzw. eine Repeat-Lösung ist schon am einfachsten...
 

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Jep, ne while-Schleife läuft solange, bis die Bedingung nicht mehr erfüllt ist. In diesem Fall also solange bis nicht not keypressed gilt, d.h. bis eine Taste gedrückt wurde. Man kann damit übrigens auch hervorragend Endlosschleifen bauen:

// Java-code
while( true ) {}
läuft ewig...
Wie man TurboPascal auf neueren Rechnern zum Laufen bringt, weiss ich auch nicht. Habs seit 10 Jahren nicht mehr drauf... probier doch mal free pascal: http://www.freepascal.org/
@TheFrozenOne: Funktionierte mein Code denn halbwegs?

geht nicht...
 

Funktionierte mein Code denn halbwegs?

Ja. Also das compilieren ging einwandfrei.

« Komponente (YPbPr)VB: Tage rechnen »
 

Schnelle Hilfe: Hier nach ähnlichen Fragen und passenden Tipps suchen!

Fremdwörter? Erklärungen im Lexikon!
Reaktionszeit
In der Elektronik versteht man unter der Reaktionszeit die Zeit, die ein Flachbildschirm benötigt, um die Farbe und die Helligkeit eines Bildpunktes zu ändern. ...

Internet-Zugriffsprogramm
Ein Internet-Zugriffsprogramm, auch Browser genannt, stellt Internetseiten für den Benutzer dar. Am bekanntesten ist der Microsoft Internet Explorer, gefolgt vom kos...

Programm
Siehe Software...