如果我将已分配的数组传递给具有不匹配维度的子例程,如何让Fortran警告我?

m.c*_*ips 2 fortran

我花了太多时间解决程序中的错误.我将子程序(让我们的调用是mysub)定义为:

subroutine mysub(hourval,dayval,some,more,args)
use globals
implicit none

real:: hourval(24,ncol,nrow)
real:: dayval(ncol,nrow)

...
end
Run Code Online (Sandbox Code Playgroud)

where hourvaldayval是包含子例程中计算输出的数组,nrow并且ncol是整数.

对子程序的调用看起来像

call mysub(daygrid,hourgrid,some,more,args)
Run Code Online (Sandbox Code Playgroud)

以前是哪个daygridhourgrid是数组allocate.hourgrid有3个尺寸(24,ncol,nrow),daygrid有2个尺寸(ncol,nrow).提及到现在为止(所有变量hourgrid,daygrid,nrow,ncol)在模块中声明globals.

我一直得到奇怪的结果,最后发现,我切换的顺序hourgriddaygrid我的子程序调用中,并改变这个解决我的问题(我在程序的实际变量有不太明显的名称,其所犯的错误有点难以辨认).但是,程序将正常编译,我不会在日志文件中收到任何相关的错误消息.

因此,我想知道是否有一种方法可以在编译时或运行时获取消息,指向该错误.我在Linux上使用英特尔Fortran 11.1,带有以下编译器标志:

-O3 -C -pg -traceback -g
Run Code Online (Sandbox Code Playgroud)

我实际上指望-C标志(相当于-check all)来检测这种错误,因为它意味着选项-check bounds.还有什么我可以做的吗?

Mal*_*ker 6

您可能希望使用假定的形状伪参数来捕获这样的错误(即real, dimension(:,:) :: dayvalreal, dimension(:,:,:) :: hourval.)

来自现代Fortran由Metcalf,Cohen和Reid(2011)解释:

假设伪参数形状时,不会发生形状或字符不一致.

此外,它并没有把我作为最令人惊奇的编码风格,通过use语句传递已经可用的变量作为同一子程序的实际参数.