코드가 다소 간단합니다 (더 큰 프로그램의 필수 요소로 축소되었습니다).FORTRAN : 범위를 벗어난 검사가 서브 루틴에서 실패합니까?
배열의 크기와 배열의 크기를 서브 루틴에 전달합니다. 전달 된 크기가 배열의 실제 크기와 일치하지 않으면 오류가 발생하지 않습니다. 그리고 나는 심지어 배열의 배열을 조작 할 수 있습니다. ' t " " !!! (필자는 메모리를 덮어 쓰지 말고 ' 덮어 쓰기). 여기
이 서브 루틴입니다 :subroutine sub(arr, narr)
implicit none
integer, intent(in) :: narr
double precision, dimension(narr) :: arr
integer :: j
do j = 1, narr
! print all the values
write(*, '("Arr[",I0,"] = ",f0.10)') j, arr(j)
! change the values
arr(j) = -10d0
enddo
end subroutine
여기에 메인 프로그램
program main
implicit none
integer, parameter :: narr = 5
! the array is made smaller
double precision, dimension(narr - 2) :: array
integer :: j
! assign values to array
array = (/ (1d0*j, j = 1,narr - 2) /)
! print using the subroutine
print*, "inside subroutine"
call sub(array, narr)
! print outside the subroutine
print *, " "
print *, "outside subroutine"
do j = 1, narr
write(*, '("Arr[",I0,"] = ",f0.10)') j, array(j)
enddo
end program
내가 ifort 컴파일 및 "이 -check 모든 "이는 메인 프로그램에서 오류를 잡으면하지만, 서브 루틴이 아닙니다.
서브 루틴의 오류도 잡을 방법이 있습니까?
이것은 버그는 아니지만 FORTRAN의 특징입니다. 어쨌든, 나는 morern 컴파일러가이를 확인할 수 있어야하고 인텔은 경고를하지 않는다는 데 동의한다. – ja72