2017-09-10 8 views
2

J'utilise gfortran version 7.2.0. Je suis assez nouveau pour Fortran. Je sais qu'il existe différentes versions de Fortran. Dans le code ci-dessous, je la déclaration de tableaux (ou en fait tenseurs) en utilisant différentes syntaxesDifférentes syntaxes pour déclarer des tableaux: avec et sans l'instruction de dimension

program arrays 
    implicit none 

    integer :: m(3, 4) 
    integer, dimension(3, 4) :: n 

    print *, "m = ", m 
    print *, "n = ", n 

end program arrays 

Dans un cas, j'utilise la déclaration dimension, dans l'autre, je ne suis pas. Ce programme compile (sans erreurs). J'utilise les drapeaux gfortran-g et -fbounds-check. L'extension de fichier du fichier avec le programme ci-dessus est f.90.

Pourquoi existe-t-il différentes syntaxes pour déclarer des tableaux dans Fortran? Quelles versions de Fortran supportent quelles syntaxes, ou est la possibilité de déclarer les rang, formes et extensions de tableaux comme pour m juste une extension du compilateur?

Répondre

4

Les déclarations

integer :: m(3, 4) 
integer, dimension(3, 4) :: n 

sont à la fois Fortran standard depuis Fortran 90. Sans l'utilisation de la :: la première ligne comme

integer m(3,4) 

serait valide avant Fortran 90.

Avant venir à autre chose, le ,dimension n'est pas une dimension déclaration mais un spécification d'attribut. Une déclaration de dimension serait

dimension n(3,4) ! With n implicitly or explicitly typed elsewhere 

L'important est que les attributs spécifiés avec déclaration de type appliquent à (presque) tous les objets déclarés. Alors

integer :: m1(3,4), m2, m3 
integer, dimension(3,4) :: n1, n2, n3 

voit m1 un tableau de rang 2, mais m2 et m3 scalaires alors n1, n2 et n3 (à moins que les propriétés de tableau donné ailleurs ou sont en fait des fonctions) sont tous les tableaux de rang 2 de forme [3,4]

les deux déclarations de la question pourrait alors être simplement

integer, dimension(3,4) :: m, n 

le « presque » vient du fait que nous pouvons avoir

integer, dimension(3,4) :: n, p(5) 

où la forme de p est [5], remplaçant le [3,4] spécifié précédemment.