首先,我不知道使用gfortran时绑定检查是自动的。使用以下代码:
gfortran -Wno-array-bounds initial_parameters.f08 derrived_types.f08 lin_alg.f08 constitutive_models.f08 input_subs.f08 Subprograms.f08 mainprog.f08
我仍然收到编译时警告:
Warning: Array reference at (1) is out of bounds (3 > 2) in dimension 2
我可能在这里很傻但是从阅读this,我认为-Wno-array-bounds
应该压制这个警告?使用-w
进行编译会成功禁止所有警告。
我不知道它是否相关,但这些警告的来源是" Subprograms.f08"和" constitutive_models.f08"这两个模块都包含子程序,并在主程序中使用。
如果我尝试使用
编译单个模块,则会出现相同的行为gfortran -Wno-array-bounds -c constitutive_models.f08
答案 0 :(得分:3)
我可以使用这个简单的代码用gfortran(4.4)确认编译 警告:
integer,parameter::dim=3
integer :: x(2)
if(dim.eq.1)write(*,*)x(dim)
end
警告:(1)处的数组引用超出范围2(3> 2)
这可能被认为是一个错误,因为人们会期望编译器优化整个if
语句。注意ifort编译就好了。
一个非常简单的解决方法修复了这个例子:
integer,parameter::dim=3
integer :: x(2),dimx=dim
if(dim.eq.1)write(*,*)x(dimx)
end
当然,因为它只是一个警告,你知道它不是问题,你也可以选择忽略它!
请注意在逻辑中使用参数,以防编译器感觉稍后要对其进行优化。
答案 1 :(得分:2)
所以我可能建议使用重载子程序来处理数据 - 然后你就会有通用行为,而不需要将维度参数显式地传递给函数(从而摆脱警告)。然后我建议你遵循Holmz的建议,即在测试阶段使用所有警告,然后在生产构建期间完全关闭它们(-w)。现在我无法找到一种有效的方法来抑制此警告(除了-w) - 似乎默认情况下检查数组边界并且不会覆盖-fno-bounds-check或-Wno-array -bounds。但是重载函数可以更好地解决您的问题,在这种情况下实现应该如下所示:
module functions
implicit none
interface test_dim
module procedure test_func1d, test_func2d, test_func3d
end interface ! test_dim
contains
subroutine test_func1d(input1d)
real, intent(in) :: input1d(:)
print*, "DOING 1 DIM"
print*, "SHAPE OF ARRAY:", shape(input1d)
end subroutine test_func1d
subroutine test_func2d(input2d)
real, intent(in) :: input2d(:,:)
print*, "DOING 2 DIM"
print*, "SHAPE OF ARRAY:", shape(input2d)
end subroutine test_func2d
subroutine test_func3d(input3d)
real, intent(in) :: input3d(:,:,:)
print*, "DOING 3 DIM"
print*, "SHAPE OF ARRAY:", shape(input3d)
end subroutine test_func3d
end module functions
program test_prog
use functions
implicit none
real :: case1(10), case2(20,10), case3(30, 40, 20)
call test_dim(case1)
call test_dim(case2)
call test_dim(case3)
end program test_prog
此函数产生的输出如下所示:
DOING 1 DIM
SHAPE OF ARRAY: 10
DOING 2 DIM
SHAPE OF ARRAY: 20 10
DOING 3 DIM
SHAPE OF ARRAY: 30 40 20