올바른 크기의 행렬을 할당하면 모든 것이 예상대로 작동합니다. 예를 들어
,이 프로그램은
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
내장 함수를 사용하여 안전 측면에 항상 배열을 트래버스합니다.
do i = lbound(t, dim=1), ubound(t, dim=1)
write (*, *) t(i, :)
end do
시작하려면 : 행렬 'T'와 'C'를 2x2가 아닌 3x3 크기로 할당하십시오. – Wildcat