passage d'une chaîne comme argument lors de la mannequin a une longueur spécifiée
si j'ai ce code
module test
contains
subroutine xx(name)
character(len=20), intent(in), optional :: name
if (present(name)) then
print *, name
else
print *, "foo"
endif
end subroutine
end module
program x
use test
call xx()
call xx("foo2")
end program
Il ne compile pas car "foo2" n'est pas de longueur 20, et le compilateur se plaint
test.f90(17): error #7938: Character length argument mismatch. ['foo2']
call xx("foo2")
-----------^
Comment puis-je faire de cette chose que le travail, sans modification de la sous-routine mannequin len cahier des charges ? Est-il obligatoire d'avoir un intermédiaire variable déclarée avec la même longueur et le passer à l'heure de l'appel ?
OriginalL'auteur Stefano Borini | 2011-01-24
Vous devez vous connecter pour publier un commentaire.
Standard de la langue peut être difficile à comprendre. J'ai lu la clause citée par @kemiisto comme exigeant longueur
(dummy arg) <= length
(réelle arg). Ici, la longueur(dummy arg) = 20
etlength (actual arg) = 4
, de sorte que la longueur(dummy arg) > length (actual arg)
, qui n'est pas autorisé par la clause. La clause parle de tronquer le réel pour correspondre à la tétine, si nécessaire, pas de rembourrage avec des blancs.Le code ne fonctionnera que si vous remplacez
character(len = 20)
aveccharacter(len = *)
Est-il un problème avec ce depuis que vous ne voulez pas modifier la longueur de l'argument cahier des charges?Puis-je suggérer par écrit une "colle" fonction qui transforme ses arguments character (len=20) et de l'application de cette fonction à un argument de xx qui pourrait ne pas être assez long: appel xx (makelen20 ("foo2"))
OriginalL'auteur M. S. B.
Me semble conforme à la norme de comportement.
Fortran 2003, 12.4.1.2 arguments Réels associés avec des données factices objets
Cependant gfortran juste s'élever un message d'avertissement
Il semble que Intel Fortran compiler est plus conforme à la norme en la matière. Donc variable intermédiaire est probablement la seule option.
Ou en fait juste la déclaration d'une variable est l'option parce que vous n'en avez pas dans votre code. Vous avez constante littérale. Les valeurs absolues ne sont pas une bonne idée de toute façon. =)
OriginalL'auteur Wildcat
La raison de cette erreur est que votre méthode est autorisé à lire/écrire
len=20
caractères de l'argumentname
. Votre littéral de chaîne est inférieure à ce montant et votre compilateur est à vous alerter à ce fait. Même si elle est déclaréeintent(in)
vous avez pu lire au-delà de l'argument réel de la longueur et de provoquer une violation d'accès, etc.Vous devriez probablement s'en tenir à
len=*
avec des arguments formels et l'utilisationlen
oulen_trim
lors de la détermination de combien de caractères il est sûr de lecture/écriture.Ou si vous devez conserver les
len=20
, vous devez utiliser une variable temporaire utilisé pour transmettre des valeurs dans cette méthode. Ou quelque chose de plus laid comme"hello"//repeat(" ", 15)
.OriginalL'auteur user7116