Вопрос

Когда я пытаюсь скомпилировать код в соответствии с оператором с ifort, он возвращает ошибку как:

    error #8169: The specified interface is not declare

Но это отлично работает на GFORTRAN, по какой -то причине мне приходится использовать компилятор Intel для составления этой работы. Язык, который я использую, это Fortran. Причина этого в том, что компилятор «ifort» не видит переменных в интерфейсе. Поэтому я разработал модуль под названием VAR, чтобы исправить это. И используйте его в каждом блоках. Но он возвращает ошибку:

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

Модуль VAR подобен следующему:

MODULE VAR
      CHARACTER(50) :: callbackID
END MODULE

Как я могу решить проблему, большое спасибо! Моя версия компилятора 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
Это было полезно?

Решение

Представленный кодекс не является законным Фортраном. Оператор использования внутри корпуса интерфейса делает доступным именем, которое такое же, как и фиктивный аргумент. Это нарушает правила общего числа языка.

Оператор использования внутри корпуса интерфейса может показаться излишним.

Другие советы

Я не вижу причины, по которой вы хотите в первую очередь в интерфейсе. Даже интерфейс может быть пропущен, потому что у вас есть подходящая процедура, доступная:

PROCEDURE( invoke_callback ), POINTER :: f_ptr => NULL()
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top