2009-12-15 4 views
8

Je voudrais vérifier si un pointeur à l'intérieur d'un type dérivé a déjà été défini ou non. J'ai écrit le simple code ci-dessous pour vous montrer mon problème:Pointeurs associés dans le type dérivé? gFortran vs Intel

program test 
implicit none 

type y 
    real(8), pointer :: x(:) 
end type y 
type(y), pointer :: w(:) 

allocate(w(2)) 
allocate(w(1)%x(2)) 

write(*,*) associated(w(1)%x), associated(w(2)%x) 

end program test 

ce code avec Compiler gfortran 4.4.1 et en cours d'exécution sur Ubuntu donne le résultat:

T F 

alors que le même code compilé sur Windows Vista avec le compilateur Intel Fortran 11.0 fournit:

T T 

le premier résultat (gfortran) est ce que je suis réellement attendais. Mais le fait que le compilateur Intel fournisse un résultat différent me fait craindre que mon code ne soit pas correct. Est-ce que je fais quelque chose de terriblement mal avec les pointeurs dans cet exemple? Une idée ou une explication?

Un grand merci d'avance pour votre aide!

Répondre

11

Vous testez pour voir si un pointeur est associé sans utiliser explicitement nullify sur les pointeurs. Une grande page sur common Fortran mistakes remarques (avec l'exemple de code): retiré

Beaucoup de gens pensent que le statut d'un pointeur qui n'a jamais été associé est .pas. associé. C'est faux. (...) Quand un pointeur est déclaré son statut est indéfini, et ne peut pas être interrogé en toute sécurité avec le associated intrinsèque.

Il semble que le compilateur gfortran peut être configuré pour annuler explicitement des pointeurs sur déclaration - vous devriez probablement penser à cela comme le compilateur réglage automatique de variables déclarées à zéro, et ne pas compter sur ce comportement. Si vous voulez être sûr, vous l'annulerez vous-même.

Modifier:

Je lis dans le guide du compilateur Intel, et il précise comment faire en sorte que le pointeur est annulé correctement - vous pouvez configurer votre type dérivé comme

type y 
    real(8), pointer :: x(:) => null() 
end type y 

Notez, cependant, qu'il semble que cela soit limité à Fortran 95, comme mentionné dans l'article lié.

+0

Merci beaucoup !! C'était en effet le problème. La solution que vous suggérez fonctionne très bien, avec le compilateur Intel et gFortran. – remek

Questions connexes