Question

Lorsque j'essaie de compiler le code sous l'instruction avec IFORT, il renvoie l'erreur comme:

    error #8169: The specified interface is not declare

Mais cela fonctionne parfaitement sur GFertran, pour une raison quelconque, je dois utiliser Intel Compiler pour compiler ce travail. La langue que j'utilise est Fortran. La raison en est que le compilateur «ifort» ne voit pas les variables dans l'interface. Je développe donc un module appelé var pour résoudre ce problème. Et utilisez-le dans tous les blocs. Mais il renvoie l'erreur:

This USE statement is not positioned correctly within the scoping unit.

Le module var est comme suivre:

MODULE VAR
      CHARACTER(50) :: callbackID
END MODULE

Comment puis-je résoudre le problème merci beaucoup! Ma version de compilateur est ifort 12.1.0

      MODULE DEMO
      USE VAR
      INTERFACE
        SUBROUTINE callback_prototype(callbackID)
            USE VAR
            CHARACTER(*) :: callbackID
        END SUBROUTINE callback_prototype
      END INTERFACE

      PROCEDURE( callback_prototype ), POINTER :: f_ptr => NULL()

      CONTAINS
      SUBROUTINE set_callback(func)
         IMPLICIT NONE
         EXTERNAL :: func

          f_ptr => func
          call HELLO
      END SUBROUTINE

      SUBROUTINE invoke_callback(callbackID)
          CHARACTER(*) :: callbackID
          if (associated(f_ptr)) call f_ptr(callbackID)
      END SUBROUTINE

      SUBROUTINE HELLO

      IMPLICIT NONE

      !dosomthing


      END SUBROUTINE
      END MODULE
Était-ce utile?

La solution

Le code tel qu'il est présenté n'est pas un Fortran légal. L'instruction d'utilisation à l'intérieur du corps de l'interface rend accessible un nom qui est le même qu'un argument factice. Cela viole les règles de portée de la langue.

L'instruction d'utilisation à l'intérieur du corps de l'interface semble être superflue.

Autres conseils

Je ne vois pas la raison pour laquelle vous voulez l'instruction d'utilisation dans l'interface en premier lieu. Même l'interface peut être ignorée, car vous avez la bonne procédure accessible:

PROCEDURE( invoke_callback ), POINTER :: f_ptr => NULL()
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top