Выделение из транспонированного массива - PullRequest
5 голосов
/ 14 мая 2019

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

1 Ответ

2 голосов
/ 14 мая 2019

Источник распределения

allocate(a(3, 2), source=transpose(b))

является действительным. Форма, указанная для a, совпадает с формой исходного выражения transpose(b). В результате a принимает значение заданного выражения.

Неправильно, если компилятор дает другой результат. Здесь не виновата процедура вывода.

gfortran 8, кажется, дает ожидаемый результат.

Интересно, что с gfortran 7 ожидаемый результат появляется, если b сам по себе не выделяется.

...