Wenn ich einen Skalar INTEGER, s, und übergeben Sie es an eine Subroutine, wird sein Wert in eine Float konvertiert und ist schrecklich ungenau. Zum Beispiel, wenn ich s = 2 und CALL print_my_int (s), wo es schreiben wird (,) es auf die Konsole, wird es Wert als 2.80259693E-45 angezeigt. Andere skalare Ganzzahlen verhalten sich ähnlich, außer in dem Fall, dass s = 0, in welchem Fall die Ausgabe 0,0000000 ist. Aber auch das ist immer noch falsch, denn eine ganze Zahl sollte offensichtlich keine Dezimalzahl und keine Mantisse anzeigen. Dies ist KEIN Ausgabeformat, da ich andere Ganzzahlen korrekt anzeigen kann, wenn sie lokal angezeigt werden.Hilfe! Übergeben FORTRAN-Ganzzahlen verwandelt sie in ungenaue schwimmt?
Irgendwelche Hinweise, was hier passiert? Muss ich den Argument-Datentyp in der Subroutinen-Definition erzwingen? Kann das überhaupt gemacht werden?
Beispielcode:
PROGRAM print_int
INTEGER s
s = 2
CALL print_my_int(s)
END PROGRAM print_int
SUBROUTINE print_my_int(x)
WRITE(*,*) x
END SUBROUTINE print_my_int
resultierende Ausgabe:
2.80259693E-45
Es hätte auch funktioniert, wenn Sie den Parameternamen von 'x' in' i' oder 'j' geändert haben, da FORTRAN Typinterferenzen basierend auf den Anfangsbuchstaben der Variablennamen hat. Aber mach das nicht - es ist eine schlechte Übung. – JasonFruit
Danke, mein Herr. Ein praktischer Tipp, aber ich werde darauf achten, das Fehlverhalten zu vermeiden. –
Es ist gut, die Anweisung "implicit none" am Anfang jedes Programms/Unterprogramms zu verwenden, wenn Sie den Compiler bei nicht deklarierten Variablen ersticken wollen. – steabert