我尝试了以下代码以使代码正常工作。我似乎需要编写一个接口来避免错误的结果。我写了以下内容,但它没有通过编译阶段。错误如下:(使用gfortran编译器)
fit.f90:34.16:
TYPE(spec), INTENT(IN) :: SMP
1
Error: Derived type 'spec' at (1) is being used before it is defined
fit.f90:35.12:
REAL(q), INTENT(OUT) :: RES
1
Error: Symbol 'q' at 1 has no IMPLICIT type
...
以下是用于说明问题的可编译代码。
MODULE prec
INTEGER, PARAMETER :: q=8
END MODULE prec
MODULE MOD_FIT
USE prec
INTEGER, PARAMETER :: NO_NI=200
TYPE spec
! source of fitting
INTEGER NW
COMPLEX(q), POINTER :: W(:),G(:)
! how spectrum is parametrized
INTEGER NO_NM ! continuous points labeled as 1,2,3,...,NO_NM
REAL(q), ALLOCATABLE :: O_N(:),O_D(:) ! frequency
REAL(q), POINTER :: A_N(:),B_N(:),A_D(:) ! A(Omega)
END TYPE
TYPE(spec) SMP
INTERFACE
SUBROUTINE NNLS_CMPLX(SMP,RES,RES_V)
IMPLICIT NONE
TYPE(spec), INTENT(IN) :: SMP
REAL(q), INTENT(OUT) :: RES
COMPLEX(q), OPTIONAL, INTENT(OUT) :: RES_V(SMP%HN)
END SUBROUTINE NNLS_CMPLX
END INTERFACE
CONTAINS
SUBROUTINE NNLS_CMPLX(SMP,RES,RES_V)
IMPLICIT NONE
TYPE(spec) :: SMP
REAL(q) :: RES
COMPLEX(q), OPTIONAL :: RES_V(*)
RES=0
IF(PRESENT(RES_V)) RES_V(1)=0
END SUBROUTINE NNLS_CMPLX
END MODULE MOD_FIT
PROGRAM MAIN
USE prec; USE MOD_FIT
REAL(q) PK_RES
COMPLEX(q) RES_V(4)
CALL NNLS_CMPLX(SMP,PK_RES,RES_V)
END
答案 0 :(得分:1)
拥有显式接口意味着编译器知道被调用的子例程或函数(过程)是什么样的。
显式接口通常不应由接口块提供,即:
interface
...
end interface
但是将程序放在 modules 中。
您绝对不能将接口块用于模块过程(放置在模块内的过程)。接口块告诉您某处有一些外部过程,其中包含您在接口块中声明的属性。但是你的程序不是外部的,而是在一个模块中。
只需删除界面块即可。
只是一个建议:在代码中使用小型大写和缩进。现在很难阅读。
解释实际的错误信息:作为francescalus注释,接口块有一个单独的范围。如果将它们放在模块中,则它们不会看到模块的其他内容。这就是编译器抱怨它不知道spec
和q
是什么的原因。