Les éléments qui définissent les paramètres de type et les limites de tableau des objets sont connus sous le nom de expressions de spécification . Dans le code de la question, nous voyons deux expressions de spécification de ce type avec real(dp) :: v(9)
le paramètre de type de type dp
et la limite du tableau 9
.
Pour une expression de spécification, seule sa valeur compte. Bien que nous ne recommandions pas de telles choses, la primauté de la valeur est la raison pour laquelle real(kind=33)
peut être utilisé de manière cohérente tout au long d'un programme. Ainsi, si vous voulez déclarer que deux objets sont du même type, il vous suffit d'utiliser des expressions qui ont la même valeur :
real(kind=33) x1, f1
real(kind=selected_real_kind(15)) x2, f2
x1=f1()
x2=f2()
end
function f1()
real(kind=33) f1
f1=1
end function f1
function f2()
real(kind=selected_real_kind(15)) f2
f2=2
end function
Ci-dessus sont présentés deux styles d'expressions de spécification : l'utilisation d'une constante littérale ( 33
) et en référençant de manière appropriée une fonction intrinsèque ( selected_real_kind(15)
). Mais les expressions de spécification peuvent aussi utiliser des objets accessibles dans la portée. Nous disposons de plusieurs techniques pour "partager" des objets entre des portées, et nous pouvons utiliser ces techniques dans nos expressions de spécification.
En effet, les déclarations dans
function vector_norm(n,vec) result(norm)
integer, intent(in) :: n
real(dp), intent(in) :: vec(n)
montrent un tel moyen avec association de noms ! L'argument factice n
est utilisé dans la spécification de vec
Le tableau est lié au tableau de l'utilisateur. Ce site n
est l'argument associé à l'argument réel 9
du programme principal : nous avons utilisé une valeur dans le programme principal pour indiquer à la fonction quelque chose sur l'un de ses arguments.
Hélas, l'association d'arguments n'est pas une forme d'association de noms qui est utile pour les paramètres de type type, parce que les paramètres de type doivent être constants (ce que les arguments factices ne sont pas). Nous pouvons utiliser un argument factice pour nous indiquer la longueur d'un objet caractère ou la taille d'un tableau, mais pas le type du caractère.
Nous pouvons utiliser d'autres formes d'association de noms pour partager des constantes entre une portée (comme le programme principal) et une autre (une fonction).
Nous pouvons utiliser hôte association o utiliser association . Je ne vais pas recréer les exemples de code de chacune de ces réponses, mais j'espère que cette réponse motive pourquoi ces deux approches fonctionnent. Aucune des deux approches n'est nécessairement meilleure que l'autre, mais une fois que vous aurez compris ce qu'elles visent à faire en termes de portée, vous pourrez comparer leur adéquation sur d'autres aspects.
Notez que la fonction vector_norm
de la première réponse liée utilise elle-même l'association use et host pour le paramètre kind (et l'association argument pour le paramètre array bound).