Fortran语言 - 显式接口(Fortran - explicit interface)

2019-09-02 12:13发布

我很新的Fortran,并为我的研究,我需要得到一个模型运行的怪物,所以我学习,因为我一起去。 所以,我很抱歉,如果我问一个“愚蠢”的问题。 我想要编译(Mac OSX上,在命令行),我已经成功地解决了一些东西,但现在我遇到一些我不知道如何解决。 我觉得我得到的错误背后的想法,但同样,不知道如何解决。

该模型是巨大的,所以我将只张贴代码段,我认为是相关的(虽然我可能是错的)。 我有几个子程序一个文件,即开头:

    !==========================================================================================!
!    This subroutine simply updates the budget variables.                                  !
!------------------------------------------------------------------------------------------!
subroutine update_budget(csite,lsl,ipaa,ipaz)

   use ed_state_vars, only : sitetype     ! ! structure
   implicit none

   !----- Arguments -----------------------------------------------------------------------!
   type(sitetype)  , target     :: csite
   integer         , intent(in) :: lsl
   integer         , intent(in) :: ipaa
   integer         , intent(in) :: ipaz
   !----- Local variables. ----------------------------------------------------------------!
   integer                      :: ipa
   !----- External functions. -------------------------------------------------------------!
   real            , external   :: compute_water_storage
   real            , external   :: compute_energy_storage
   real            , external   :: compute_co2_storage
   !---------------------------------------------------------------------------------------!


   do ipa=ipaa,ipaz
      !------------------------------------------------------------------------------------!
      !      Computing the storage terms for CO2, energy, and water budgets.               !
      !------------------------------------------------------------------------------------!
      csite%co2budget_initialstorage(ipa) = compute_co2_storage(csite,ipa)
      csite%wbudget_initialstorage(ipa)   = compute_water_storage(csite,lsl,ipa)
      csite%ebudget_initialstorage(ipa)   = compute_energy_storage(csite,lsl,ipa)
   end do

   return
end subroutine update_budget
!==========================================================================================!
!==========================================================================================!

我相处的行错误

budget_utils.f90:20.54:

真实的,外部:: compute_co2_storage 1
错误:伪参数在(1)过程“compute_co2_storage”的“csite”具有需要此过程显式接口的属性

(我收到了一堆他们,但他们基本上所有的相同)。 现在,看着ed_state_vars.f90(这是“拿来主义”在子程序),我发现

!============================================================================!
!============================================================================!
  !---------------------------------------------------------------------------!  
  ! Site type:
  ! The following are the patch level arrays that populate the current site.
  !---------------------------------------------------------------------------!  

type sitetype


     integer :: npatches

     !  The global index of the first cohort in all patches
     integer,pointer,dimension(:) :: paco_id

     ! The number of cohorts in each patch
     integer,pointer,dimension(:) :: paco_n

     ! Global index of the first patch in this vector, across all patches
     ! on the grid

     integer :: paglob_id

     ! The patches containing the cohort arrays
     type(patchtype),pointer,dimension(:) :: patch

等等等等 - 这又进了另一个500行左右。 于是去了一点,好像原来的子程序需要为它的程序明确的接口,以便能够使用的(虚拟)的说法csite。 同样,我太新的Fortran,但我真的想了解它“认为”。 我一直在寻找这意味着什么有一个明确的接口,当(以及如何!)使用它等,但我无法弄清楚如何将其应用在我的情况。 我应该可能使用不同的编译器(英特尔?)。 任何提示?

编辑:那么csite被宣布为target中的所有步骤,并从申报type(site type)包含了一整套的pointer S,如在规定sitetype 。 但是sitetype是被正确use d从另一个模块( ed_state_vars.f90中的所有过程)。 因此,我仍然感到困惑,为什么它给了我明确的接口错误?

Answer 1:

“显式接口”是指所述界面的程序(子例程或函数)被声明为编译器。 这使编译器调用的程序和实际过程之间的检查参数的一致性。 这可以找到很多的程序员的失误。 为此,您可以写出与接口interface语句,但有一个更容易的方法:将程序变成一个模块,并use来自任何其他实体模块调用它-从主程序或本身不是任何程序在模块。 但你不use同一模块中的步骤,由另一程序-它们会自动互相认识。

放置过程到模块自动使其接口编译器知道的和可用于交叉检查时,它是use编 这是更容易,更容易出错比写的接口。 一个接口,您可以复制的过程参数列表。 然后,如果你修改过程中,你还可以修改来电而且接口(当然!)的。

显式接口( interface ,当你用“先进”的论点陈述或模块)是必需的。 否则,编译器不知道产生正确的调用

如果你有一个过程,它是use版,你不应该描述它external 。 也有极少数的用途external现代Fortran的-所以,去掉external属性,把所有的程序到一个模块中,并use它们。



Answer 2:

我跑进你遇到,而我是想在我的Mac 10.9安装ED2同样的问题。 我通过在一个模块在该文件中所有的子程序固定它,那就是:

module mymodule
contains
subroutine update_budget(csite,lsl,ipaa,ipaz)
other subroutines ecc.
end module mymodule

同样的事情必须做在包装10至15的其他文件。 我编写的所有文件,并生成相应的目标文件,但现在我得到有关未定义符号的错误。 不过,我怀疑这是独立的修改,所以如果有人有耐心,这可能是至少解决界面问题的方法。



文章来源: Fortran - explicit interface