Variable Bestimmung-Typ in Fortran
In Fortran gibt es eine Möglichkeit, um zu bestimmen, den Typ einer Variablen?
Einen möglichen Anwendungsfall, in dem der Typ einer Variablen, der erforderlich wäre, ist die folgende. Wir übergeben Sie eine variable mit dem Typ, der als argument an eine Funktion aufrufen zu können Typ-spezifischen code durch diese Funktion, wodurch die Notwendigkeit, separate ähnliche Funktionen für jeden Datentyp.
Was vintage von fortran? 77? 9x? 200x?
InformationsquelleAutor tibbs | 2010-04-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gut Sie könnten in der Lage sein, das zu tun, was Sie wollen, wenn Sie Durcheinander mit der ART intrinsische und Zeiger, aber wenn Sie nur damit beschäftigt sind, die Signatur von Funktionen und Unterprogrammen, lassen Sie es zu Fortran. Wenn Sie definieren
und
in einem Modul, und deklarieren Sie ein interface wie dieses
(Achtung, ich habe nicht überprüft die syntax im detail, das ist deine Sache.)
dann Fortran wird mit dem Aufruf die richtige version der Funktion. Sicher, Sie haben zu schreiben, sind beide Versionen der Funktion, aber das ist wirklich der Fortran-95 Weg, es zu tun. Dies kann Recht mühsam, ich Neige dazu, zu schreiben, eine generische version und führen Sie ein sed-script zu spezialisieren. Es ist ein bisschen ein Durcheinander, aber es funktioniert.
Wenn der code der Funktion ist identisch abgesehen von der Art der Argumente, die ich Schreibe mal die Funktion für echte(8) (oder was auch immer) und schreiben eine version für real(4) die Anrufe der realen(8) die version eingewickelt in Typ-Konvertierungen.
In Fortran 2003 gibt es verbesserte Methoden Definition polymorphe und generische Funktionen, aber ich habe nicht wirklich meinen Kopf um Sie noch.
InformationsquelleAutor High Performance Mark
Ja, es gibt zwei Möglichkeiten.
Der erste Weg erfordert, dass Sie schreiben eigene Funktionen oder Subroutinen für jede variable Typ, aber Sie nicht haben, um verschiedene Funktionen aufrufen. Dies kann oder kann nicht nah genug sein, um das, was Sie wollen. Schreiben Sie die separate Routinen, die dann zu schreiben, eine Schnittstelle zu erstellen, die eine generische Funktion oder Unterroutine einwickeln diese spezifische Unterprogramme. Sie müssen nicht übergeben der variable geben, oder etwas besonderes tun, in Ihren Anruf -- es ist über die Erklärung und automatisch durch den compiler die variable selbst, solange die Variablen sind unterschiedlich genug, dass der compiler unterscheiden kann (es gibt Regeln darüber, was erforderlich ist). Dies ist ähnlich wie systeminterne Funktionen arbeiten-Sie können rufen Sie die Sünde mit einem real-argument, double precision real argument oder ein Komplexes argument und ruft der compiler den korrekten, aktuellen Funktion und gibt die übereinstimmenden Ergebnis. High-Performance-Marke entworfen eine Lösung entlang dieser Linien. Für eine andere Frage, ich habe ein Beispiel, wo die Unterscheidung der Variablen wurde array Rang: wie schreibt wrapper für 'allocate'. Ein Vorteil dieser Methode ist, dass es weithin Unterstützung von Fortran-Compilern.
In Fortran 2003/2008 gibt es umfangreiche Objekt-orientierte features. Unter dem Stichwort "Fortran 95/2003 explained" von Metcalf, Reid und Cohen, "Um alternativen code auszuführen, je nach dem dynamischen Typ eine polymorphe Entität und für den Zugriff auf die dynamischen Teile, die wählen Sie die Art Konstrukt zur Verfügung gestellt." Die wählen Sie die Art Aussage ist ein bisschen ähnlich wie ein select case - Anweisung. Dies ist die Unterstützung durch weniger Compiler. Wieder, werden Sie nicht haben, um passieren die Art, da der compiler Abbildung können Sie es von der variable selbst. Aber es muß sich um eine polymorphe Art... Sowohl Intel ifort und gfortran-Liste Typ auswählen und polymorphe Datentypen unterstützt, die später mit einigen experimentellen Aspekte in gfortran (http://gcc.gnu.org/wiki/Fortran2003). Dies sind die neuesten Ergänzungen zu diesen Compilern.
InformationsquelleAutor M. S. B.