[我正在对一些旧的Fortran代码进行现代化处理,但我无法摆脱某个地方的等效语句(长话短说:混合使用太复杂了,要转换所有内容都需要太多的工作)。
我需要等值数组的长度取决于某些输入,如以下代码:
program test_equivalence
implicit none
type :: t1
integer :: len = 10
end type t1
type(t1) :: o1
call eqv_int(o1%len)
call eqv(o1)
return
contains
subroutine eqv_int(len)
integer, intent(in) :: len
integer :: iwork(len*2)
real(8) :: rwork(len)
equivalence(iwork,rwork)
print *, 'LEN = ',len
print *, 'SIZE(IWORK) = ',size(iwork)
print *, 'SIZE(RWORK) = ',size(rwork)
end subroutine eqv_int
subroutine eqv(o1)
type(t1), intent(in) :: o1
integer :: iwork(o1%len*2)
real(8) :: rwork(o1%len)
equivalence(iwork,rwork)
print *, 'LEN = ',o1%len
print *, 'SIZE(IWORK) = ',size(iwork)
print *, 'SIZE(RWORK) = ',size(rwork)
end subroutine eqv
end program test_equivalence
该程序将使用gfortran 9.2.0创建长度为0的数组。这是输出:
LEN = 10
SIZE(IWORK) = 0
SIZE(RWORK) = 0
LEN = 10
SIZE(IWORK) = 0
SIZE(RWORK) = 0
使用gfortran 5.3.0编译时,相同的代码将返回Array 'rwork' at (1) with non-constant bounds cannot be an EQUIVALENCE object
,该警告自gfortran 6.2.0起消失,但数组的大小始终为0。那么也许是编译器错误?
源代码确实不是有效的Fortran程序。具体而言,它违反了Fortran 2018的数字约束 C8106:
检测到此冲突。如果没有这样的功能,那就是编译器中的一个缺陷(一个错误)。默认情况下,“具有能力”并不意味着要这样做,因此请仔细查看是否有确实导致此检测的选项。equivalence-object不得是基础对象为..自动数据对象..的指定者。>
作为编号约束,编译器必须有能力