Compiler errors 未报告Fortran 77中参数的秩不匹配错误

Compiler errors 未报告Fortran 77中参数的秩不匹配错误,compiler-errors,fortran,gfortran,fortran90,fortran77,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) add2p.f90:191:22: call gettimes(cdfid,ml_time,ml_ntimes) 1 E

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

这是Fortran 90中的代码

program test 
use my_module
real         ml_time
call gettimes(cdfid,ml_time,ml_ntimes)
add2p.f90:191:22:

call gettimes(cdfid,ml_time,ml_ntimes)
                  1
Error: Rank mismatch in argument ‘times’ at (1) (rank-1 and scalar)
在调用子例程中,这是如何定义传递的变量

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中的错误

program test 
use my_module
real         ml_time
call gettimes(cdfid,ml_time,ml_ntimes)
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中没有报告编译器错误。

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

仅当标量是数组元素时,才允许将标量传递给假定大小的数组(请参见序列关联)

我在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。

请显示在Fortran 90中生成的错误和一些合理完整的代码示例。需要整个结构,而不仅仅是子例程,请参见我的答案为什么。@VladimirF-我所做的更改是否可以接受?是,我认为这种情况没问题。@VladimirF-我还添加了F77代码。那么在Fortran 77中,标量是如何转换成向量的,还是反过来转换成向量的,或者这是一个单独的问题?:)没有转换,它是使用指针(通过引用调用)作为长度为1的数组访问的,因为标量数组和长度为1的数组在内存中表示相同,所以它可以工作。请参阅有关序列关联的问题和询问。。“序列关联”感谢你指出了这个概念。的确,那篇文章很好。请特别注意“如果将非数组元素的标量(如常量1或标量变量)传递给数组伪参数,也会出现此错误(如错误#8299)。在某些情况下,可以使用数组构造函数将标量转换为数组,如[1],但会失去序列关联的好处。”