2017-07-18 86 views
2

我想端口一段代码的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 77的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) 

错误这是代码是如何组织的

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中没有报告编译器错误。

+0

请显示在Fortran 90中生成的错误以及一些合理的*完整*代码示例[mcve]。 –

+0

整个结构是需要的,不仅仅是子程序,看到我的答案为什么。 –

+0

@VladimirF - 我做出了可接受的更改吗? – gansub

回答

2

您没有显示足够的代码,但您可能在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.

+0

你是怎么猜测我在使用模块的?这真是太神奇了!向你致敬。 – gansub

+0

@VlaldimirF - 是的调用函数和调用的函数在Fortran 77中有两个不同的文件。另一个好的捕获。顺便说一下,现在我下一次问一个问题,我知道要包含哪些细节才能构成一个完整的例子。感谢您指出了这一点 ! – gansub

+0

所以在Fortran 77中,标量是如何转换成矢量的,反之亦然,或者是一个单独的问题?:) – gansub