J'ai constaté que ce code se comportait de manière inattendue
module testmodule
integer, parameter :: LCHARS = 50
contains
subroutine init()
call foobar("foobar")
end subroutine
subroutine foobar(s)
character(len=*), intent(in) :: s
call bar(s)
end subroutine
subroutine bar(str)
character(len=LCHARS), intent(in) :: str
print *, str
end subroutine
end module
program foo
use testmodule
call init()
end program
Ce code imprime des déchets qui dépendent du compilateur.
Je pense que le problème réside dans le fait que je dois passer par une routine avec des len=*
pour un argument de type chaîne, qui est ensuite transmis à une routine dont la longueur est spécifiée pour l'argument de type chaîne.
Que se passe-t-il exactement sous le capot, et où ce comportement est-il décrit dans la norme ? Devrais-je m'abstenir de spécifier la longueur des arguments des routines de caractères, puisque ce comportement peut se produire à tout moment sans avertissement ?