12 votes

Fortran 90 Présence d'arguments facultatifs

Je ne comprends pas le comportement de la fonction intrinsèque present() avec pgf90 7.2. J'ai écrit un programme d'exemple de 20 lignes pour tester cela, mais les résultats ne sont toujours pas clairs pour moi. Observez :

subroutine testopt(one,two,three,four,five)

  implicit none

  integer, intent(in) :: one,two
  integer, intent(out) :: three
  integer, intent(in), optional :: four
  integer, intent(out), optional :: five

  three = one + two

  print *,"vérification de la présence : ", present(four), present(five)

  if (present(four) .and. present(five)) then

    five = four*four

  end if

end subroutine testopt

Si j'appelle testopt(1,2,(n'importe quelle variable)) depuis mon programme principal, cela imprime : "vérification de la présence : T F". Cependant, si j'appelle testopt(1,2,(n'importe quelle variable)) depuis un sous-programme, cela imprime : "vérification de la présence : T T". Je m'attendais à voir "vérification de la présence : F F" dans les deux cas, car je n'appelle le sous-programme qu'avec les 3 arguments obligatoires et aucun des optionnels. Je ne comprends pas pourquoi cela se comporte ainsi, et cela cause un bogue majeur dans un programme sur lequel je travaille. Je suis reconnaissant pour toute lumière apportée. Merci.

11voto

M. S. B. Points 19509

Placez-vous cette sous-routine dans un module puis avez-vous une déclaration "use" pour ce module dans la routine appelante (programme principal ou sous-routine) ? Une règle typique est que de nombreuses fonctionnalités avancées / nouvelles de Fortran 90 nécessitent une interface explicite afin que l'appelant et l'appelé passent les arguments de manière cohérente. Le moyen le plus simple et le meilleur pour y parvenir est avec module / use. Juste une supposition...

1voto

Norbert S Points 29

En Fortran moderne, les arguments optionnels doivent être déclarés comme tels dans la fonction appelante (soit à travers un module, soit via une interface explicite). En Fortran 77, il était possible de simplement omettre le dernier argument, s'il s'agissait d'un nombre scalaire, de sorte que les arguments optionnels pouvaient être passés sans déclaration supplémentaire dans la routine d'appel. Cela n'a peut-être pas été une partie de la norme Fortran, mais c'était une fonctionnalité utile fournie par des implémentations de compilateur avisées. Malheureusement, le Fortran moderne a supprimé cette fonctionnalité géniale.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X