Я пытаюсь понять ошибку, с которой я столкнулся в своем коде. При попытке выделить массив с помощью транспонирования массива я использую в своем коде инструкцию allocate с 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)) вместо транспонированного исходного массива. Я что-то здесь не так делаю или это ошибка компилятора?