안녕하세요 저는 포트란 프로그램에서 일하고 있으며 이상한 문제를 해결했습니다. 특정 서브 루틴을 호출하기 전에 배열의 일부 값을 직접 출력하려고하면 올바른 값을 얻습니다. 그런 다음 서브 루틴을 시작하면 동일한 배열의 값을 출력하려고합니다. 서브 루틴을 마친 후에 배열의 값을 최종 출력하고 값이 예상 값으로 돌아옵니다. 아무도 왜 그 이유를 이해하도록 도와 줄 수 있습니까? 내 코드는 다음과 같습니다 :잘못된 값을 반환하는 포트란 서브 루틴
첫째, 주요 기능의 서브 루틴 호출, 값 내가 쓰기 문에서 출력하려는 함께 : 이것은 다음 서브 루틴을 호출
if (iter .eq. 5) then
write(*,*) 'vp vals: ',vp(0,23471), vp(0,23475)
end if
CALL GRID_DIVISION(&
& NPTMAX, DIM, TYPEMAX, NEIGHMAX, NPTC, GRIDLIMIT, &
& GRIDN, GRIDNUM, GRID, GNEIGH, XP, PTTYPE, TYPE, &
& GRIDP, TEMP_GRIDP, GNEIGHMAX, PAINT, VP, ITER, gridvel &
& )
if (iter .eq. 5) then
write(*,*) 'vp vals: ',vp(0,23471), vp(0,23475)
end if
있는 나는 게시 할 예정입니다 관련 부분 만 :
SUBROUTINE GRID_DIVISION(&
& NPTMAX, DIM, TYPEMAX, NEIGHMAX, NPTC, GRIDLIMIT, &
& GRIDN, GRIDNUM, GRID, GNEIGH, XP, PTTYPE, TYPE, &
& GRIDP, TEMP_GRIDP, GNEIGHMAX, PAINT,VP,ITER, gridvel &
& )
IMPLICIT NONE
INTEGER, INTENT(IN) :: NPTMAX, DIM, TYPEMAX, NEIGHMAX, GNEIGHMAX
INTEGER, INTENT(IN) :: NPTC
INTEGER, INTENT(IN) :: GRIDLIMIT
INTEGER, INTENT(IN) :: GRIDN(0: DIM - 1)
INTEGER, INTENT(IN) :: GRIDNUM
INTEGER, INTENT(IN) :: PTTYPE(0: NPTMAX)
INTEGER, INTENT(IN) :: TYPE(0: TYPEMAX)
INTEGER, INTENT(INOUT) :: GRIDP(0: NPTMAX)
INTEGER, INTENT(INOUT) :: GNEIGH(1: GRIDLIMIT, 0: GNEIGHMAX)
REAL , INTENT(IN) :: GRID(1: GRIDLIMIT, 0: DIM - 1, 0: 1)
REAL , INTENT(IN) :: XP(0: DIM - 1, 0: NPTMAX)
REAL , INTENT(IN) :: VP(0: DIM - 1, 0: NPTMAX)
INTEGER, INTENT(INOUT) :: TEMP_GRIDP(0: NPTMAX)
INTEGER, INTENT(INOUT) :: PAINT(0:NPTMAX)
INTEGER, INTENT(INOUT) :: ITER
real, intent(inout) :: gridvel(GRIDNUM,0:1)
INTEGER :: II, JJ, KK
INTEGER :: DNUM
INTEGER :: GRIDXP
INTEGER :: SGRIDXP
INTEGER :: EGRIDXP
INTEGER :: SGRIDYP
INTEGER :: EGRIDYP
INTEGER :: SEARCH
INTEGER :: SCOUNT
INTEGER :: FCOUNT
INTEGER :: ERROR
INTEGER, PARAMETER :: CELL = 2
if (iter .eq. 5) then
write(*,*) 'vp vals: ',vp(0,23471), vp(0,23475)
end if
...
end subroutine
이 섹션 이후에는 더 이상 설명이 나오지 않습니다. 나는이 코드를 실행하면이 부분에 대한 반복 5 내 출력은 다음과 같습니다 내 배열 부사장은 서브 루틴의 값을 가지고 있지 않는 이유
vp vals: 75.00000 75.00000
vp vals: 0.00000000E+00 0.0000000E+00
vp vals: 75.00000 75.00000
나는 간단하게 알아낼 수 없습니다.