Frage

Wenn ich versuche, Code unter der Anweisung mit IFORT zu kompilieren, gibt er Fehler als:

    error #8169: The specified interface is not declare

Aber es funktioniert perfekt für GFortran, aus irgendeinem Grund muss ich den Intel -Compiler verwenden, um diese Arbeit zu kompilieren. Die Sprache, die ich benutze, ist Forran. Der Grund dafür ist, dass der "Ifort" -Kompiler die Variablen in der Schnittstelle nicht angezeigt. Deshalb entwickle ich ein Modul namens Var, um das zu beheben. Und benutze es in allen Blöcken. Aber es gibt einen Fehler zurück:

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

Das VAR -Modul ist wie folgt:

MODULE VAR
      CHARACTER(50) :: callbackID
END MODULE

Wie kann ich das Problem beheben, vielen Dank! Meine Compiler -Version ist 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
War es hilfreich?

Lösung

Der so vorgestellte Kodex ist nicht legal fortran. Die Anwendungserklärung in der Schnittstellenkörper macht zugänglich zu einem Namen, der wie ein Dummy -Argument entspricht. Dies verstößt gegen die Sprachregeln der Sprache.

Die Verwendung der Verwendung in der Schnittstellenkörper scheint überflüssig zu sein.

Andere Tipps

Ich sehe nicht den Grund, warum Sie die Verwendungsanweisung in der Schnittstelle in erster Linie wünschen. Sogar die Schnittstelle kann übersprungen werden, da Sie über die richtige Prozedur zugänglich sind:

PROCEDURE( invoke_callback ), POINTER :: f_ptr => NULL()
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top