Pergunta

Gostaria de verificar se um ponteiro dentro de um tipo derivado já foi definido ou não.Escrevi o seguinte código simples para mostrar meu 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 com gFortran 4.4.1 e executá-lo no Ubuntu dá o resultado:

T F

enquanto o mesmo código compilado no Windows Vista com o compilador Intel Fortran 11.0 fornece:

T T

O primeiro resultado (gFortran) é o que realmente espero.Mas o fato de o compilador Intel fornecer um resultado diferente me faz temer que meu código não esteja correto.Estou fazendo algo terrivelmente errado com as dicas deste exemplo?Alguma ideia ou explicação?

Muito obrigado antecipadamente pela sua ajuda!

Foi útil?

Solução

Você está testando para ver se um ponteiro está associado sem usar explicitamente nullify nos ponteiros.Uma ótima página em erros comuns do Fortran observações (com o exemplo de código removido):

Muitas pessoas pensam que o status de um ponteiro que nunca foi associado é .not.associado.Isto é falso.(...) Quando um ponteiro é declarado, seu status é indefinido e não pode ser consultado com segurança com o associated intrínseco.

Parece que o compilador gfortran pode ser configurado para anular explicitamente os ponteiros na declaração - você provavelmente deveria pensar nisso como se o compilador definisse automaticamente as variáveis ​​declaradas como zero e não contasse com esse comportamento.Se quiser ter certeza, você mesmo a anulará.

Editar:

Estou lendo o guia do compilador Intel e ele especifica como garantir que o ponteiro seja anulado corretamente - você pode configurar seu tipo derivado como

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

Observe, entretanto, que parece que isso está limitado ao Fortran 95, conforme mencionado no artigo vinculado.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top