2014-05-22 10 views
-2

이것은 간단한 프로그램입니다. j>4 일 때 오류가 나올 것으로 예상했지만 Fortan은 그 대신 array(2,5)=0.0을 표시합니다. 스택 오버플로 오류가 발생하면 더 유용 할 것입니다.왜 오버플로 오류가 발생하지 않습니까?

귀하의 의견은 무엇입니까?

program main 

implicit none 

integer,parameter :: n=2,z=4 
!real, dimension(1:2,1:4) :: array 
real,allocatable :: array(:,:) 
integer :: i,j 

allocate(array(n,z)) 
array = 0.0 
array(1,1)=1.0 ; array(1,2)=2.0 ; array(1,3)=3.0 ; array(1,4)=4.0 
array(2,1)=5.0 ; array(2,2)=6.0 ; array(2,3)=7.0 ; array(2,4)=8.0 

do j=1,5 
    do i=1,2 
     write(*,*) i,j 
    write(*,*) array(i,j) 
    enddo 
enddo 

end program main 
+2

메모리에 특정 공간을 할당하지 않았기 때문에 ** 사용하려고하면 ** 충돌이 발생합니다. 상황에 따라 문제가 발생할 수도 있고 그렇지 않을 수도 있습니다. 이를 정의되지 않은 동작이라고합니다. – Havenard

답변

4

배열의 범위를 초과했습니다. 이것은 반드시 스택의 경계를 넘어서는 것은 아니며이 작은 배열로는 그렇게하지 않을 것입니다. Fortran 컴파일러에 의해 생성 된 실행 파일은 일반적으로 잘못된 첨자 오류를 검사하지 않습니다. 그 이유는 그러한 검사가 프로그램을 느려지 게하기 때문입니다. 컴파일 시간 옵션을 사용하여 이러한 확인을 요청할 수 있습니다. 예를 들어, gfortran은 -fcheck=all 또는 -fcheck=bounds을 사용합니다. ifort를 사용하면 -check all 또는 -check bounds입니다. "all"옵션에는 "bounds"옵션과 추가 검사가 포함됩니다. G95 -fbounds 검사 및 실행과 컴파일

+0

또는 심지어 ifort로'-check' –

1

이 파일 xoverflow.f90의 라인 (18)에

을 제공합니다 (단위 6) 역 추적 : 사용할 수 없습니다, -ftrace = 프레임 또는 -ftrace = 전체 포트란 런타임 컴파일 오류 : 배열 요소가 범위를 벗어남 : 5 (1 : 4), dim = 2

및 gfortran -fbounds-check는 비슷한 결과를 제공합니다. 따라서이 무료 컴파일러와 적어도 -fbounds-check 및 -Wall 옵션을 사용하여 코드를 테스트해야합니다.

관련 문제