Pergunta

Ao escrever e chamar sub-rotinas puros em Fortran 90 usando gfortran, como faço para descobrir por que o compilador emite esse erro?

Error: Subroutine call to XXXX at (1) is not PURE

Vou tentar colocar minha pergunta especificamente quanto eu posso, enquanto ao mesmo tempo ser o suficiente geral para ser útil aos outros, então eu vou evitar colar no meu código real e em vez disso vai esboçar o que aconteceu.

Eu compreendo que há várias regras sobre procedimentos puros em Fortran 90, que acho que basicamente se resumem a não permitir efeitos colaterais em qualquer funções ou sub-rotinas, e não permitindo alterações nos parâmetros de sub-rotinas declaradas com intent(in). Eu tenho uma série de sub-rotinas que inicialmente não foram declarados para ser puro, e cujos parâmetros não ter declarado a intenção, mas que no entanto não realizaram efeitos colaterais. Primeiro, eu mudei todas as declarações de parâmetro ter explicitamente declarado a intenção, seja in, out, ou inout. Então, eu declarei todas as sub-rotinas para ser PURE. Naturalmente, muitos erros ocorreu na primeira tentativa, mas o compilador me disse o que os erros eram (parâmetro tal e tal com intent(in) está sendo modificado, por exemplo), então um-por-um que eu fixa-los todos.

Existem chamadas entre esses procedimentos, no entanto, e por isso agora eu ainda recebo muitos erros no formato mostrado acima: Subroutine call to XXXX at (1) is not PURE. O que eu não entendo é por a chamada não é puro. Eu fiz tudo que eu posso pensar em fazer XXXX puro, mas o compilador ainda pensa que não é.

Então, minha pergunta --rephrased-- é: como faço para obter gfortran para me dizer por que ele acha que XXXX não é puro

Foi útil?

Solução

"colocou todas as sub-rotinas pura na biblioteca que estou trabalhando, em um módulo (que o meu código de cliente então utilizado). ...... Não sei por que ....., mas depois de fazer isso mais mensagens de erro útil apareceu que me permitiu rastrear as impurezas restantes ".

A colocação das sub-rotinas em um módulo e, em seguida, usá-los torna a interface explícita. Isso permite que o compilador para verificar acordo entre a chamada eo sub-rotina e gerar mensagens de erro se houver uma discrepância. Muito útil, assim colocando sub-rotinas e funções em módulos boas práticas.

A outra maneira de fazer uma interface explícita é escrever uma interface, mas isso é um trabalho extra e um passo extra de errar.

Há uma longa lista de requisitos em sub-rotinas puros / funções. Se você tem Fortran 95/2003 explicado por Metcalf, Reid e Cohen, ver secção 6.10. Por exemplo, não "save" variáveis, nenhuma declaração stop, sem IO no arquivo externo, ...

Você também pode tentar outros compiladores para ver se a sua mensagem de erro é mais útil. Outras versões livres, dependendo do sistema operacional, incluem g95 e Sun Studio.

Outras dicas

Eu vou tentar ser mais claro sobre a minha pergunta na minha resposta. Eu estava relutante em postar meu código por estas razões.

  1. eu não espero que outras pessoas para depurar o meu código para mim. Essa é a maneira é pedir muito.
  2. Eu queria a minha pergunta e sua resposta (s) a ser mais geral.
  3. Parecia gfortran estava me contando minhas sub-rotinas não eram puros, mas não estava me dizendo por que razão considerava-os a não ser puro.

Então, eu esperava para descobrir, não como corrigir o meu código e fazer os procedimentos PURE, mas sim para descobrir como persuadir mais informações úteis a partir gfortran, para me ajudar a corrigir o meu código.

Duas coisas que eu fiz ajudou a cumprir essas metas. Claro, os resultados podem variar.

  1. Adicionado esse sinalizador para a linha de comando gfortran: -fmax-errors = 100 Claro, eu tinha feito isso antes, mas ainda parecia não me diga o que eu precisava saber.
  2. Colocado todas as sub-rotinas PURE na biblioteca que estou trabalhando, em um módulo (que o meu código de cliente então utilizado). Desde ascendência desta biblioteca é como Fortran77, originalmente, não foi esse o caso. Não sei por que (é por isso que gostaria de salientar que "os resultados podem variar"), mas depois de fazer este erro mais útil mensagens apareceu que me permitiu rastrear as impurezas restantes.

É uma espécie de uma questão nebulosa, eu sei, e eu não tenho certeza o quão útil ele será. Ainda assim, obrigado a todos que lêem, comentou, e resposta adicionado (s).

Provavelmente porque ele não está marcado como PURE. O fato de que uma sub-rotina é puro não está relacionado com o que ele faz ou não com seus argumentos, mas ao fato de que ele é declarado como PURE. (É claro que, uma vez declarada como pura, o que você faz com os argumentos entra em jogo e está marcada.)

Eu sou iniciante Fortran e na semana passada cheguei capítulo sobre procedimentos Fortran em meu livro. Pode ser que eu não estou certo, mas ... Então, se você vai desculpar o meu Inglês, existem algumas observações:

  1. Não é bom estilo de sub-rotinas de declaração puros. É aconselhável para funções .
  2. procedimentos Pure foram introduzidos em Fortran padrão 95. Não em Fortran 90.
  3. Você problema provavelmente decorre de C1270 item (Fortran 2003 Standard) com a seguinte redacção:

Se um procedimento que não é nem um procedimento intrínseco nem uma função declaração é usado em um contexto que exige que ela seja pura, depois sua interface deve ser explícito no âmbito dessa utilização. A interface deve especificar que o procedimento é puro.

Espero que é informação útil.

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