在fortran中编写特定接口的正确方法是什么?

时间:2015-06-03 16:54:29

标签: interface module fortran optional user-defined

我尝试了以下代码以使代码正常工作。我似乎需要编写一个接口来避免错误的结果。我写了以下内容,但它没有通过编译阶段。错误如下:(使用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

1 个答案:

答案 0 :(得分:1)

拥有显式接口意味着编译器知道被调用的子例程或函数(过程)是什么样的。

显式接口通常不应由接口块提供,即:

interface
...
end interface

但是将程序放在 modules 中。

您绝对不能将接口块用于模块过程(放置在模块内的过程)。接口块告诉您某处有一些外部过程,其中包含您在接口块中声明的属性。但是你的程序不是外部的,而是在一个模块中。

只需删除界面块即可。

只是一个建议:在代码中使用小型大写和缩进。现在很难阅读。

解释实际的错误信息:作为francescalus注释,接口块有一个单独的范围。如果将它们放在模块中,则它们不会看到模块的其他内容。这就是编译器抱怨它不知道specq是什么的原因。