Fortran 77中的参数错误中的排名不匹配未被报告

时间:2017-07-18 10:43:21

标签: compiler-errors fortran gfortran fortran90 fortran77

我正在尝试将一段代码从Fortran 77移植到Fortran 90,我有一个关于在Fortran 77中捕获排名不匹配的问题。

这是Fortran 90中的代码

program test 
use my_module
real         ml_time
call gettimes(cdfid,ml_time,ml_ntimes)

在调用子例程中,这是传递变量的定义方式

module my_module 
use netcdf

subroutine gettimes(cdfid,times,ntimes)
real times(*)

  call check(nf90_inq_dimid(cdfid,'time', timid))

  call check(nf90_inquire_dimension(cdfid, timid, len = ntimes))

  call check(nf90_inq_varid(cdfid,'time',timid))

  call check(nf90_get_var(cdfid,timid,times(1:ntimes)))


end subroutine gettimes

在Fortran 77(.f文件)和gfortran 5.4中,为什么这不会产生编译错误?

当我将它移植到Fortran 90时,相同的代码会产生排名不匹配编译错误。

这是Fortran 90中的错误

add2p.f90:191:22:

call gettimes(cdfid,ml_time,ml_ntimes)
                  1
Error: Rank mismatch in argument ‘times’ at (1) (rank-1 and scalar)

在Fortran 77中,这就是代码的组织方式

program test 
real         ml_time
call gettimes(cdfid,ml_time,ml_ntimes)

在另一个文件xyz.f

  subroutine gettimes(cdfid,times,ntimes,ierr)

  include "netcdf.inc"

  integer   ierr,i
  real times(*)
  integer didtim,ntimes

  integer   cdfid,idtime


  do 10 i=1,ntimes
    call ncvgt1(cdfid,idtime,i,times(i)) ! get times
  10 continue




  end

当然我通过使它们具有相同的排名来摆脱错误,但我想知道为什么Fortran 77中没有报告编译器错误。

1 个答案:

答案 0 :(得分:2)

您没有显示足够的代码以确定,但您可能在Fortran 90代码中使用显式接口(例如,模块)。在这种情况下,编译器有义务检查这种不一致性并且必须产生错误。使用隐式接口时不是这种情况(它们在Fortran 77中没有显式接口)。

只有当标量是数组元素时,才允许将标量传递给假定大小的数组(参见 sequence association )。

我在gfortran 4.8中收到警告,但如果调用是在不同的源文件中,则可能不会发生:

  subroutine s1(a)
    integer :: a(*)
  end

  subroutine s2()
    call s1(1)
  end subroutine

> gfortran rank.f90 -c
rank.f90:7.12:

    call s1(1)
            1
Warning: Rank mismatch in argument 'a' at (1) (rank-1 and scalar)

请注意,编译器默认将每个源代码编译为Fortran 2008 +扩展。它没有以任何方式区分Fortran 90和77.

值得注意的是,.f和.f90并不意味着Fortran 77和Fortran 90,它们意味着固定格式和自由格式源。这两种源代码形式都是有效的Fortran 90 - Fortran 2008。