Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
kilix
Anmeldungsdatum: 05.02.2022 Beiträge: 175
|
Verfasst am: 07.04.2022, 18:03 Titel: Programm wird nach Eingabe von <Enter> sofort beendet |
|
|
ich bin's schon wieder!
Ich habe ein Menüprogramm mit einer Programmliste geschrieben. Am Ende kann man die Nummer desgewünschten Programms oder, um zu beenden, 0 eingeben. Gibt man eine falsche Nummer ein wird kein Programm gefunden und man landet in der Fehlerroutine mit der Meldung "Falsche Eingabe". Diese Meldung bleibt kurze Zeit stehen und wird dann durch die neuerliche Frage nach der Programmnummer überschrieben.
Das ganze funktioniert gut so lang die Nummer richtig ist oder, wenn sie falsch ist, die Fehlermeldung bis nach Ablauf des SLEEP-Befehls stehen lässt.
Aber sobald man die Frage nach der Programmnummer mit <Enter> beantwortet oder während der Fehlermeldung auf <Enter> drückt wird das Programm beendet.
Das verstehe ich nicht denn die Variable Integervariable Prog ist nach Eingabe von <Enter> gleicht Null und damit eine Falscheingabe. Hier ist der Codeausschnitt (davor ist nur die Programmliste): Code: |
PRINT " 1 Programm1
PRINT " 2 Aktualisierung der Datenbank"
PRINT " 3 Systemwartung (nur f.d. Systemkontrolle)"
'
DIM AS INTEGER Prog, Q
'
Q = 1
DO WHILE Q = 1
LOCATE 33,
COLOR 7, 5
INPUT "Nummer des Programms eingeben (0=Beenden): ", Prog
Q = 0
'
' Programmaufrufe
'
IF Prog = 0 THEN GOTO Ende: ENDIF
Dim result As INTEGER
if Prog = 1 THEN Run "programm1.exe" ENDIF
if Prog = 2 THEN Run "programm2.exe" ENDIF
if Prog = 3 THEN Run "programm3.exe" ENDIF
if result = -1 then print "Programmaufruf hat nicht funktioniert" ENDIF
'
' Fehlerroutine
'
Q = 1
VIEW PRINT 33 to 37
cls(2)
COLOR 4, 0
LOCATE 33, 5
PRINT "Falsche Eingabe": COLOR 7, 0
SLEEP 2000, 1
LOOP
CLOSE
END |
Logisch kann ich mir das nicht erklären oder ich steh da irgendwo auf dem Schlauch _________________ Grüße
kilix |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4594 Wohnort: ~/
|
Verfasst am: 07.04.2022, 19:02 Titel: |
|
|
Hier kommen zwei Effekte zusammen:
- INPUT liest einen String ein, der dann in deinem Fall in eine Zahl umgewandelt wird. Ein Leerstring wird zu 0 umgewandelt, weshalb dein Programm nicht zwischen Leerstring und Eingabe der 0 unterscheiden kann. Wenn du das umgehen willst, musst du dann doch einen String einlesen und auswerten.
- SLEEP leert den Tastaturpuffer nicht. Tasten, die während der Wartezeit gedrückt werden, landen im Puffer und werden dann in der nächsten Eingabe abgerufen. Eine gedrückte Enter-Taste bewirkt dann eine Leereingabe im INPUT und diese eine Auswertung als Zahl 0.
Den Tastaturpuffer leeren kannst du z. B. so:
Code: | DO
SLEEP 1
LOOP UNTIL LEN(INKEY) = 0 |
_________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
kilix
Anmeldungsdatum: 05.02.2022 Beiträge: 175
|
Verfasst am: 07.04.2022, 19:44 Titel: |
|
|
Danke für diese Erklärung! Diese Verhaltensweisen sind wichtig. Bei SLEEP hab ich in der Befehls-Referenz überlesen und das war der Grund meines Problems. Dass der Integerwert von Nullstring 0 ist war mir bekannt und damit war dieser Punkt in meiner Frage einfach "zu kurz gedacht".
Danke für deinen Code-Vorschlag!
Inzwischen komme ich mit dem Programmieren meines Projektes schon gut durch. Allerdings lerne ich immer wieder auf neue Sachen. Das hat zur Folge, dass ich in bereits geschriebenen Programmen immer wieder Verbesserungen machen muss.
Da fällt mir noch ein Punkt ein: in dem alten DEC Basic auf der DEV PdP 11/45 gab es den befehl STOP. Das war ideal zum Testen weil man einerseits direkt die BAS-Version laufen lassen konnte, die dann bei STOP stehn blieb. Jetzt hatte man die Möglichkeit beliebige Variable des Programmes abzufragen und auch Befehle einzugeben. Anschließend ließ man das Programm einfach weiterlaufen. Z.B. bis zum nächsten STOP. Diese Möglichkeit gibt es offenbar in FreeBasic nicht, kann es wohl auch nicht geben weil die BAS nicht lauffähig sind. Ich gehe davon aus, dass das auch vom betriebssystem abhängt. _________________ Grüße
kilix |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4594 Wohnort: ~/
|
Verfasst am: 07.04.2022, 21:13 Titel: |
|
|
Das Problem (wenn man es so nennen will) ist, dass FreeBASIC keine interpretierte, sondern eine kompilierte Sprache ist. Es ist allerdings möglich, das Programm mit Debugging-Symbolen zu kompilieren und dann mit einem Debugger auch zwischendurch anzuhalten und fortzusetzen. In diesem Bereich kenne ich mich jedoch nicht aus. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1208 Wohnort: Ruhrpott
|
Verfasst am: 08.04.2022, 14:36 Titel: |
|
|
Die einfachste Möglichkeit ist, durch an geeigneter Stelle eingefügte PRINT - Befehle die entsprechenden Variablen auszudrucken. Wenn dann alles zur Zufriedenheit läuft, werden die Befehle wieder gelöscht oder auskommentiert.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
|