我试图了解我的代码中遇到的错误。当尝试使用数组的转置来分配数组时,我在代码中使用了带有source = transpose(original_array)的分配语句。但是,使用这种方法无法获得预期的结果。似乎索引已关闭一个,并且源数组的第一行被跳过了。
示例:
program testalloc
real*8, allocatable :: a(:, :)
real*8, allocatable :: b(:, :)
allocate(b(2, 3))
b(1, :) = [1, 2, 3]
b(2, :) = [4, 5, 6]
call printmat(b)
a = transpose(b)
call printmat(a) ! Good
deallocate(a)
allocate(a(3, 2), source=transpose(b))
call printmat(a) ! Bad
deallocate(a)
allocate(a(3, 2))
a = transpose(b)
call printmat(a) ! Good
contains
subroutine printmat(mat)
real*8, intent(in) :: mat(:, :)
integer :: i
write(*,*) 'print'
do i = 1, size(mat, 1)
write(*,*) mat(i, :)
end do
end subroutine
end program
给出
print
5.0000000000000000 3.0000000000000000
6.0000000000000000 0.0000000000000000
3.2114266979681025E-322 5.0000000000000000
用于使用gfortran(gcc版本7.3.0(Ubuntu 7.3.0-27ubuntu1〜18.04))进行编译而不是转置后的原始数组后的源分配。我在这里做错了还是编译器错误?
答案 0 :(得分:2)
来源分配
allocate(a(3, 2), source=transpose(b))
是有效的。为a
指定的形状与源表达式transpose(b)
的形状相同。结果,a
接受给定表达式的值。
编译器给出不同的结果是不正确的。输出例程不应该归咎于此。
gfortran 8似乎可以提供预期的输出。
有趣的是,如果b
本身不是可分配的,则对于gfortran 7会出现预期的结果。