제시된 코드는 합법적 인 Fortran이 아닙니다. 인터페이스 본문 내부의 사용 명령문은 더미 인수와 동일한 이름에 액세스 할 수있게합니다. 이것은 언어의 범위 규칙을 위반합니다.
인터페이스 본문 내부의 사용 명령문은 불필요한 것으로 보입니다.
문제
IFORT와 함께 명령문에 따라 코드를 컴파일하려고하면 오류를 반환합니다.
error #8169: The specified interface is not declare
그러나 그것은 Gfortran에서 완벽하게 작동합니다. 어떤 이유로 든 인텔 컴파일러를 사용 하여이 작업을 컴파일해야합니다. 내가 사용하는 언어는 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
해결책
제시된 코드는 합법적 인 Fortran이 아닙니다. 인터페이스 본문 내부의 사용 명령문은 더미 인수와 동일한 이름에 액세스 할 수있게합니다. 이것은 언어의 범위 규칙을 위반합니다.
인터페이스 본문 내부의 사용 명령문은 불필요한 것으로 보입니다.
다른 팁
처음부터 인터페이스에서 사용 명령문을 원하는 이유는 보이지 않습니다. 올바른 절차에 액세스 할 수 있으므로 인터페이스를 건너 뛸 수 있습니다.
PROCEDURE( invoke_callback ), POINTER :: f_ptr => NULL()