Es gibt mehrere Probleme zusätzlich zu der strukturellen/code Anordnung diejenigen bereits zur Kenntnis genommen.
Zuerst KIND
eine ganze Zahl ist, so dass Sie wollen
real, parameter :: ikind = selected_real_kind(p=15)
zu
integer, parameter :: ikind = selected_real_kind(p=15)
Idealerweise möchte man, dass (in einem Modul also) nur an einer Stelle definieren, ändern, und die Bezugs es aus Ihrem Hauptprogramm und der Funktion, aber der Code sollte gut sein, wie es für Testzwecke ist. Ein zweites Problem, das Neuankömmlinge oft auf Fortran (und Python2) stürzt, ist, dass reelle Zahlen und ganze Zahlen unterschiedliche Typen sind und nicht allgemein austauschbar sind.
faren = (9/5)*c + 32
vereinfacht zu
faren = (1)*c + 32
weil ganzzahlige Teilung ein ganzzahliges Ergebnis hat; 9/5 = 1
Fortran ist pingelig numerische Werte (das ist sozusagen der ganze Sinn der Sprache) so, was Sie wollen wahrscheinlich ist:
faren = (9.0/5.0) * c + 32.0
Oder genauer gesagt, wenn faren
mit einem definierten spezifische Präzision ikind
,
faren = (real(9.0,ikind)/real_(5.0,ikind)) * c + real(32.0,ikind)
oder
faren = (9.0_ikind/5.0_ikind) * c + 32.0_ikind
Diese Syntax lässt die Köpfe der Leute explodieren. Willkommen in modernen Fortran;)
Die letzte Ausgabe befasst sich mit den Schrecken von Fortran I/O. Aus der Sicht des Designs müssen Sie wissen, welche Ergebnisse der Benutzer erwartet, und sicherstellen, dass das Ausgabeformat diese anzeigen kann. Der zulässige Bereich der Eingabewerte für c
ist -273.15 (Geben oder Nehmen) zu einer oberen Grenze, die auf dem Anwendungsfall für den Code beruht. Wenn Sie mit Kochtemperaturen zu tun haben, werden Sie wahrscheinlich 400,0 nicht überschreiten; Wenn Sie Fusionsforschung betreiben, könnten Sie viel höher gehen. Sind 8 Zahlen hinter dem Komma nützlich oder glaubwürdig? In diesem Fall testen wir nur den Code, so dass wir nicht viel Präzision in der Ausgabe benötigen.
10 format(a,es10.2)
oder
10 format(a,g16.8)
Sie müssen die gesamte Feldbreite (die Zahl vor dem Punkt), um sicherzustellen, können die Dezimalstellen enthalten (das: Sie werden das Ausgabeformat zu so etwas wie ändern möchten Zahl nach dem Punkt) zusammen mit dem ganzzahligen Teil der Zahl plus dem Platz, der benötigt wird, um Vorzeichen und Exponent anzuzeigen. Für wissenschaftliche Notation werden vier Zeichen von Mantissenzeichen, Dezimalpunkt, 'E' und Exponentenzeichen gegessen. Es ist möglicherweise sicherer, wenn Sie nur ein Ausgabeformat von *
verwenden; Es ist frustrierend, gleichzeitig mit Zahlen und Formatierungen zu kämpfen.
Wenn Sie dem Körper der Funktion 'implizite none' hinzufügen, erhalten Sie einen guten Hinweis, den Sie teilweise mit' real function faren' aufgreifen. Dein Compiler sagt, dass 'real' und' real (kind = ikind) 'nicht gleich sind. Haben Sie die Definitionen konsistent und die Dinge sind in Ordnung. [Eine explizite Schnittstelle verfügbar zu haben, hilft hier: siehe Module und interne Funktionen.] – francescalus