Pregunta

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:

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 Intel proporciona un resultado diferente me hace temer mi código podría no ser correcta. Estoy haciendo algo terriblemente mal con los punteros en este ejemplo? Cualquier idea o explicación?

Muchas gracias de antemano por su ayuda!

¿Fue útil?

Solución

Se está probando para ver si un puntero se asocia sin utilizar explícitamente nullify sobre los punteros. Una gran página sobre las declaraciones errores comunes Fortran (con el código muestra extraída):

  

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 a su estado no está definido, y no se puede consultar de forma segura con el associated intrínseca.

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 usted quiere estar seguro, usted anula por sí 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 este se limita a Fortran 95, tal como se menciona en el artículo enlazado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top