Fortran 寻址无限多态伪参数的单个元素时,选择了错误的列
考虑以下Fortran程序:Fortran 寻址无限多态伪参数的单个元素时,选择了错误的列,fortran,gfortran,Fortran,Gfortran,考虑以下Fortran程序: program test_prg implicit none integer :: i integer, allocatable :: arr(:, :) arr = reshape([(i, i = 1, 100)], [10, 10]) do i = 1, 3 print *, 'Column', i call write_array(arr(1:2, i)) end do contains subroutin
program test_prg
implicit none
integer :: i
integer, allocatable :: arr(:, :)
arr = reshape([(i, i = 1, 100)], [10, 10])
do i = 1, 3
print *, 'Column', i
call write_array(arr(1:2, i))
end do
contains
subroutine write_array(array)
class(*), intent(in) :: array(:)
integer :: i
do i = 1, size(array)
select type (elem => array(i))
type is (integer)
print '(I0)', elem
end select
end do
end subroutine
subroutine write_array_alt(array)
class(*), intent(in) :: array(:)
integer :: i
select type (array)
type is (integer)
print '(I0)', array
end select
end subroutine
end program
使用gfortran 9.3.0编译,程序打印:
Column 1
1
2
Column 2
21
22
Column 3
41
42
如您所见,它每隔一列跳过一列。如果我将对
write\u array
的调用替换为对write\u array\u alt
的调用,其中我选择了整个数组的类型,而不是单个元素,则会按预期打印每一列。这是一个GFrTrAN bug还是这个代码是非法的?< /P>不知道细节,但是与C++、C和Python等其他语言一样,整型是一个基本类型,而不是一个类。如果将基本类型视为类,则地址计算将不正确。在_alt函数中,数组被视为一个类。@cup,一个无限制的多态实体与一个内在类型实体的类型兼容程度与它与一个非内在类型实体的类型兼容程度一样。下面是comp.lang.fortran上的一篇博文,征求意见