2009-12-15 29 views
8

Me gustaría comprobar si un puntero dentro de un tipo derivado ya se ha definido o no. Escribí el siguiente código simple que le muestre mi problema:Punteros asociados en tipo derivado? 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 

Compilar este código con gfortran 4.4.1 y ejecutarlo en Ubuntu da el resultado:

T F 

mientras que el mismo código compilado en Windows Vista con el compilador Intel Fortran 11.0 ofrece:

T T 

el primer resultado (gfortran) es lo que estoy realmente esperando. Pero el hecho de que el compilador de Intel proporcione un resultado diferente me hace temer que mi código no sea correcto. ¿Estoy haciendo algo terriblemente mal con los indicadores en este ejemplo? Alguna idea o explicación?

¡Muchas gracias de antemano por su ayuda!

Respuesta

11

Está probando para ver si un puntero está asociado sin utilizar explícitamente nullify en los punteros. Una gran página en common Fortran mistakes observaciones (con el ejemplo de código eliminados):

Muchas personas piensan que el estado de un puntero que nunca se ha asociado es .no. asociado. Esto es falso (...) Cuando se declara un puntero, su estado no está definido y no se puede consultar de forma segura con el intrínseco associated.

Parece que el compilador gfortran puede ser configurado para anular de forma explícita en la declaración punteros - probablemente debería pensar en esto como el compilador de configurar automáticamente las variables declaradas a cero, y no contar con ese comportamiento. Si quieres estar seguro, lo anularás tú mismo.

Editar:

estoy leyendo a través de la guía compilador de Intel, y especifica cómo asegurarse de que el puntero es anulado correctamente - se puede configurar el tipo derivado como

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

Tenga en cuenta, sin embargo, que parece que esto está limitado a Fortran 95, como se menciona en el artículo vinculado.

+0

Muchas gracias !! Este fue de hecho el problema. La solución que sugiere funciona muy bien, con el compilador de Intel y gFortran. – remek

Cuestiones relacionadas