Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Programm wird nach Eingabe von <Enter> sofort beendet

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
kilix



Anmeldungsdatum: 05.02.2022
Beiträge: 175

BeitragVerfasst am: 07.04.2022, 18:03    Titel: Programm wird nach Eingabe von <Enter> sofort beendet Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4594
Wohnort: ~/

BeitragVerfasst am: 07.04.2022, 19:02    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
kilix



Anmeldungsdatum: 05.02.2022
Beiträge: 175

BeitragVerfasst am: 07.04.2022, 19:44    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4594
Wohnort: ~/

BeitragVerfasst am: 07.04.2022, 21:13    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1208
Wohnort: Ruhrpott

BeitragVerfasst am: 08.04.2022, 14:36    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz