2014-01-06 4 views
1

코드가 다소 간단합니다 (더 큰 프로그램의 필수 요소로 축소되었습니다).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 모든 "이는 메인 프로그램에서 오류를 잡으면하지만, 서브 루틴이 아닙니다.

서브 루틴의 오류도 잡을 방법이 있습니까?

+0

이것은 버그는 아니지만 FORTRAN의 특징입니다. 어쨌든, 나는 morern 컴파일러가이를 확인할 수 있어야하고 인텔은 경고를하지 않는다는 데 동의한다. – ja72

답변

1

예. 배열을 dimension(:) 서브 루틴 - assumed-shape 배열로 선언하십시오. 이 포트란> 90 선언을 사용하려면 프로 시저 인터페이스를 호출자에게 알려줘야합니다. 가장 쉬운 방법은 모듈에 프로 시저를두고 호출자의 모듈에 use을 넣는 것입니다. 배열의 크기를 실제로 서브 루틴으로 전달할 필요는 없습니다.이 값을 size(arr)으로 지정할 수 있습니다. 나는이 버그를 유지하기 위해 인수 narr을 남겨 두었습니다.

module MySub 

contains 

subroutine sub(arr, narr) 
implicit none 
integer, intent(in) :: narr 
double precision, dimension(:) :: 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 

end module MySub 


program main 

use MySub 

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 
+0

답변 해 주셔서 감사합니다. 원래 루틴은 모듈에 있으므로 문제는 없지만 서브 루틴에서 가정 된 크기의 배열을 사용하지 않으려 고하지 않았습니다. 컴파일러가 나에게 잘못된 배열을 전달하길 바란다. 이 기능을 사용하는 방법이 있습니까, 아니면 "size (arr) == narr"을 수동으로 확인해야합니까? – smoebius

+1

배열에 크기 'narr'이 있다는 것을 컴파일러에게 알리면, 여러분이 옳은지 여부에 관계없이 여러분의 말을들을 것입니다. 크기가 작은 배열을 사용하고 크기에 대한 인수를 명시 적으로 전달하지 않으므로 작업이 적고 오류가 발생하지 않습니다. Fortran> = 90 메서드를 사용하고 가정 된 크기의 배열과'size'와 같은 내장 함수를 사용할 것을 권장합니다. –