2016-12-20 6 views
0

Ich versuche ein einfaches Programm zu schreiben, um eine Funktion mit Fortran95/03 zu berechnen, die als Eingabe eine Zahl (x) benötigt und als Ausgabe eine Zahl (y) bekommt. Die Benutzereingabe ist ein real :: input und der Leseaufruf sieht aus wieWie überprüft man, ob die Benutzereingabe in die Variable passt?

read (*,*, iostat=stat) input 
if(stat > 0) then 
    print *, "False input, use numbers!" 

Der iostat mir hilft zu überprüfen, ob die Eingabe eine Zahl oder ein Buchstabe war.

Mein Problem ist, dass wenn ich eine sehr große Zahl eingeben, wie 1000000000000, stürzt das Programm mit der Fehlermeldung "Pufferüberlauf" ab. Ich weiß, dass ich das reale größer als eine 4-Byte-Variable machen kann, aber ich kann auch die Eingangszahl vergrößern, so dass das Problem nicht gelöst wird.

Die Hauptfrage ist, ist es möglich zu verhindern, dass das Programm aufgrund von Benutzereingaben abstürzt?

+0

Willst du damit sagen, dass das Programm beendet wird, selbst wenn 'iostat =' gegeben ist? Obwohl das Folgende keine Antwort auf die Frage ist, können Sie nicht einfach die Eingabe in der Form "1.5e903" anstatt der unplausibel langen "1500000000000000000000000 ... 0" eingeben? – francescalus

Antwort

1

Die Überprüfung der Benutzereingaben ist eine sehr einfache Technik, die in allen Arten von Software verwendet werden muss, die mit anderen Personen als nur dem Autor interagieren. Es wird in allen Programmiersprachen verwendet.

Sie können nur eine einfache Bedingung verwenden

if (input > input_max) then 
    print *, "Input value too large, try again" 
    cycle ! or return stop or set some flag or whatever 
end if 

den Wert nicht Vergessen Sie kann auch zu klein!

Es ist wichtig zu verstehen, woher der Absturz kommt. Es kommt sicherlich nicht nur daher, dass man eine große Zahl eingibt, sondern die Zahl schlecht verwendet, zum Beispiel ein zu großes Array zuweist oder eine Berechnung vornimmt, die eine Gleitkommaausnahme auslöst.

1

Lesen Sie die Eingabe als Zeichenfolge, validieren Sie dann die Zeichenfolgeneingabe, und verwenden Sie dann einen internen Lesevorgang, um die validierte Zeichenfolge in eine REAL-Datei zu konvertieren.

Es gibt viele Aspekte des prozessorabhängigen Verhaltens bei der Eingabe und Ausgabe, als ein allgemeines Prinzip, wenn Sie Robustheit wollen, dann müssen Sie viel von der Beinarbeit selbst tun. Wenn zum Beispiel eine fehlerhafte Eingabe für einen Real bereitgestellt wird, besteht keine Anforderung, dass ein Prozessor dies als eine Fehlerbedingung identifiziert und einen von Null verschiedenen IOSTAT-Code zurückgibt.

Listengesteuerte Eingabe bietet weitere Herausforderungen, da sie eine Reihe von überraschenden Funktionen aufweist, die Sie und Ihre Benutzer stolpern können.

Verwandte Themen