记一个gcc7代编译器下allocate-source中有关ar
2023-07-19 本文已影响0人
别有路
Bug情况
最近写Fortran代码的时候遇到了个怪bug, 代码如下:
然后离谱的来了, 我发现在gcc750和gcc710里面跑出来的shape_data
的lbound都是0, 也就是说index是从0开始的, 像C一样了...
但是在gcc11下面就没问题, 是从1开始的
而且下面注释那几行打开的话也没问题, 似乎就是传参进去才会有问题
module m1
implicit none
contains
subroutine m1s1(data)
implicit none
integer(kind=4),intent(in) :: data(:)
integer, allocatable :: shape_data(:)
allocate(shape_data, source=shape(data))
! allocate(shape_data(size(shape(data))), source=shape(data)) ! it's ok
print *, ubound(shape_data), ubound(shape(data))
print *, lbound(shape_data), lbound(shape(data))
end subroutine
end module
program main
use m1
implicit none
integer,allocatable :: a(:)
call m1s1([1,2,3])
!allocate(a, source=shape([4,4,5]))
!print *, ubound(a)
!print *, lbound(a)
end program
run一下:
DESKTOP-TKTNVE0:shape_bound$ gfortran --version
GNU Fortran (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0
DESKTOP-TKTNVE0:shape_bound$ gfortran main.F90
DESKTOP-TKTNVE0:shape_bound$ ./a.out
0 1
0 1
解决思路
- 要么换个编译器
- 要么像上面注释行一样, 制定以下shape吧..但是这样用source的意义小了...就是少写一行吧那
总结, 一个字, 离谱!