Если вы выделяете матрицы нужного размера, тогда все должно работать должным образом.
Например, эта программа
program main
implicit none
double precision, dimension(:, :), allocatable :: t, c
integer :: i
allocate (t(1:2, 1:2))
allocate (c(1:2, 1:2))
t = reshape([1, 3, 2, 4], shape(t))
do i = 1, 2
write (*, *) t(i, :)
end do
write (*, *) ""
c = t(2:1:-1, :)
do i = 1, 2
write (*, *) c(i, :)
end do
end program main
производит следующий вывод
1.0000000000000000 2.0000000000000000
3.0000000000000000 4.0000000000000000
3.0000000000000000 4.0000000000000000
1.0000000000000000 2.0000000000000000
Или, если вы действительно хотели работать с матрицами 3х3, то ошибка в линии C=T(2:1:-1, :)
, Это должно быть C=T(2:0:-1, :)
.
program main
implicit none
double precision, dimension(:, :), allocatable :: t, c
integer :: i
allocate (t(0:2, 0:2))
allocate (c(0:2, 0:2))
t = reshape([1, 4, 7, 2, 5, 8, 3, 6, 9], shape(t))
do i = 0, 2
write (*, *) t(i, :)
end do
write (*, *) ""
c = t(2:0:-1, :)
do i = 0, 2
write (*, *) c(i, :)
end do
end program main
Выход:
1.0000000000000000 2.0000000000000000 3.0000000000000000
4.0000000000000000 5.0000000000000000 6.0000000000000000
7.0000000000000000 8.0000000000000000 9.0000000000000000
7.0000000000000000 8.0000000000000000 9.0000000000000000
4.0000000000000000 5.0000000000000000 6.0000000000000000
1.0000000000000000 2.0000000000000000 3.0000000000000000
быть осторожным с подсчета элементов массивов. Off-by-one errors может быть довольно сложно отлаживать, поэтому лучше всегда начинать отсчет с 0 или всегда с 1. И чтобы быть в безопасности, всегда переходите к массивам с помощью lbound
и ubound
intrinsics, вместо того чтобы использовать явные границы, как это делается выше:
do i = lbound(t, dim=1), ubound(t, dim=1)
write (*, *) t(i, :)
end do
Для начала: вы выделяете матрицы 'T' и' C' размером 3x3, а не 2x2. – Wildcat