我花了太多时间解决程序中的错误.我将子程序(让我们的调用是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 hourval和dayval是包含子例程中计算输出的数组,nrow并且ncol是整数.
对子程序的调用看起来像
call mysub(daygrid,hourgrid,some,more,args)
Run Code Online (Sandbox Code Playgroud)
以前是哪个daygrid和hourgrid是数组allocate.hourgrid有3个尺寸(24,ncol,nrow),daygrid有2个尺寸(ncol,nrow).提及到现在为止(所有变量hourgrid,daygrid,nrow,ncol)在模块中声明globals.
我一直得到奇怪的结果,最后发现,我切换的顺序hourgrid和daygrid我的子程序调用中,并改变这个解决我的问题(我在程序的实际变量有不太明显的名称,其所犯的错误有点难以辨认).但是,程序将正常编译,我不会在日志文件中收到任何相关的错误消息.
因此,我想知道是否有一种方法可以在编译时或运行时获取消息,指向该错误.我在Linux上使用英特尔Fortran 11.1,带有以下编译器标志:
-O3 -C -pg -traceback -g
Run Code Online (Sandbox Code Playgroud)
我实际上指望-C标志(相当于-check all)来检测这种错误,因为它意味着选项-check bounds.还有什么我可以做的吗?
您可能希望使用假定的形状伪参数来捕获这样的错误(即real, dimension(:,:) :: dayval和real, dimension(:,:,:) :: hourval.)
来自现代Fortran由Metcalf,Cohen和Reid(2011)解释:
假设伪参数形状时,不会发生形状或字符不一致.
此外,它并没有把我作为最令人惊奇的编码风格,通过use语句传递已经可用的变量作为同一子程序的实际参数.