Vladimir F gibt an approach unter Verwendung von typgebundenen Prozeduren, die in Fortran 2003 eingeführt wurden, und Kommentare zur polymorphen Deklaration von class
.
Diese Antwort geht davon aus, dass Sie, wie die Frage nahelegt, eine Vier-mal-vier-Matrix oder zumindest eine beim Kompilieren bekannte Größe haben. Im weiteren Gebrauch möchte man vielleicht verallgemeinern. Der Wert würde dann das Komponenten-Array zuweisbar machen (was sicherstellt, dass es irgendwie zugeordnet ist und feststellt, dass dies auch nicht Fortran 90/95 ist).
Alternativ hat Fortran 2003 auch das Konzept parametrisierte abgeleitete Typen eingeführt. Hier, ähnlich wie die Idee der Länge in einer Zeichenvariablen könnte man eine Länge-parametrisiert abgeleiteten Typ:
type square_matrix(n)
integer, len :: n
real matrix(n,n)
end type square_matrix
Deklarieren von Variablen wie
type(square_matrix(4)) A ! Like type(four_by_four_matrix), perhaps
type(square_matrix(8)) B ! Like type(eight_by_eight_matrix), perhaps
One selbst haben können latente Länge Variablen dieses Typs
type(square_matrix(:)), allocatable :: A, B
integer q
q = ... ! Something run-time, perhaps.
allocate(square_matrix(q) :: A)
B = square_matrix(q)(matrix) ! Constructor using a matrix value
Die typgebundenen Verfahren wirkt auf einen beliebigen Typ parametrisierten, indem angenommen Länge Syntax:
subroutine inv(sm)
class(square_matrix(*)), intent(inout) :: sm
...
end subroutine inv
Ein fast vollständiges Beispiel wäre wie folgt.
Natürlich ist man nicht auf quadratische Matrizen beschränkt: mehrere Parameter können verwendet werden. Außerdem habe ich auch die Möglichkeit der Art-Parametrisierung übersprungen.
Ich habe darüber nachgedacht darüber zu schreiben, wie es für diese Verwendung ganz natürlich ist. Aber ich bin immer noch nicht bereit, dies in der Praxis zu benutzen, weil die Unterstützung von gfortran immer noch nicht in den Versionen verfügbar ist, die die meisten Leute benutzen. –
Ich hatte nicht bemerkt, dass es sogar in den letzten gfortran-Versionen Unterstützung gab (aber ich behalte das nicht bei), ja, das ist eine Antwort für die Zukunft und das breitere Publikum. Es gibt einige Beispiele auf dieser Seite von PDTs, vielleicht wegen der begrenzten Unterstützung von Compilern, und dies scheint ein einfacher und natürlicher Fall zu sein. – francescalus