mardi 13 novembre 2007

Argument optionnel en Fortran 90

Le fortran est l'un des langages informatiques pionniers. S'il peut paraître archaïque par rapport à nombre de langages modernes, il reste encore très utilisé dans l'industrie et en recherche (souvent sous la version fortran 90) de par l'existence de nombreux "gros" codes et bibliothèques éprouvés depuis de (très) nombreuses années.

"Y en a un qui bouge au fond de la classe !"

Le code que je vous propose ici montre comment implémenter un argument optionnel dans une procédure Fortran 90. Si ce genre de fonctionnalité est très simple à coder dans un langage moderne, il nécessite un certain effort ici.
"Dis donc Machin ! Le tableau c'est devant, pas par la fenêtre !"

Le code :

SUBROUTINE reprimande(mot1, mot2opt)
IMPLICIT NONE

CHARACTER(LEN = 8), INTENT(in) :: mot1
CHARACTER(LEN = 8), INTENT(in), OPTIONAL :: mot2opt
CHARACTER(LEN = 8) :: mot2

IF (PRESENT(mot2opt)) THEN
mot2 = mot2opt
ELSE
mot2 = "Machin !"
END IF

PRINT*, mot1//" "//mot2

END SUBROUTINE reprimande

PROGRAM instit
IMPLICIT NONE

INTEGER :: i
CHARACTER(LEN = 8) :: a, b

INTERFACE
SUBROUTINE reprimande(mot1, mot2opt)
CHARACTER(LEN = 8), INTENT(in) :: mot1
CHARACTER(LEN = 8), INTENT(in), OPTIONAL :: mot2opt
CHARACTER(LEN = 8) :: mot2
END SUBROUTINE reprimande
END INTERFACE

DO i = 1, 3
a = "Dis donc !"
b= "Toi !"
CALL reprimande(a,b )
a = "KESTUFAY "
CALL reprimande(a)
END DO

END PROGRAM instit


Discussion :

Plusieurs éléments du code (toujours aussi inutile soit dit en passant...) sont indispensables pour avoir effectivement un argument facultatif :

  1. L'option OPTIONAL dans la déclaration de la variable d'entrée mot2opt.
  2. La présence d'une seconde variable mot2.
  3. La structure de contrôle testant la présence de l'argument avec PRESENT.
  4. Enfin, une interface pour la procédure en question dans le programme principal.

Il est clair que ça ne donne pas envie de rendre des arguments facultatifs vu la quantité de lignes pour une fonctionnalité aussi "basique". Mais ça peut servir occasionnellement.

Pour info, en Ruby c'est plutôt simple :

def reprimander (qui, comment = "")
puts "#{qui}, je te reprimande #{comment}"
end

reprimander "Maxime"
reprimander "Kevin", "SEVEREMENT !"

1 commentaires:

Lefty a dit…

la vache, ton blog a déjà pas mal bougé, je suis impressionné, si,si, même si je n'y pompe rien....

Huuuuuge!!!