2011-04-12 2 views
4

GNU Fortran (v4.4.3) 또는 Sun Studio F95 (v8.3)로 컴파일하고 배열 범위를 검사하지 않으면 다음 프로그램이 오류없이 실행됩니다. 배열 범위 검사가 (각각 gfortran -fbounds-checkf95 -C)에 전환 될 때 썬 스튜디오 컴파일 된 실행 파일이 런타임 오류를 제공하는 반면 그러나, GNU 컴파일 된 실행은 오류없이 다시 실행에 오류가있어크기가 0 인 배열 및 배열 경계 검사

****** FORTRAN RUN-TIME SYSTEM ****** 
Subscript out of range. Location: line 44 column 20 of 'nosize.f90' 
Subscript number 2 has value 1 in array 't$27' 

x에 대한 자동 배열 임시 인수를 사용하는 sub2()을 호출하십시오. sub1() 호출은 컴파일러와 플래그를 사용하여 정상적으로 실행됩니다.

제 생각에이 프로그램은 0 크기의 배열이 0이 아닌 크기의 배열처럼 참조 될 수 있고 x의 길이가 0 인 차원의 명시적인 인덱싱이 없다는 점에서 "합법적"입니다. 하지만 여기에 누락 된 제로 크기 배열 슬라이스 또는 자동 배열 미묘함이 있습니까? 그리고 배열 경계 검사가 다른 컴파일러에서 동일하게 동작 할 것으로 기대해야합니까? 그렇지 않으면 공급 업체별 확장으로 간주해야합니까?

MODULE subs 
    IMPLICIT NONE 
CONTAINS  
    SUBROUTINE sub1(x) 
    IMPLICIT NONE 
    REAL :: x(:,:) 
    PRINT*,'------------------------------------' 
    PRINT*,SHAPE(x) 
    PRINT*,SIZE(x) 
    END SUBROUTINE sub1 

    SUBROUTINE sub2(n1,n3,x) 
    IMPLICIT NONE 
    INTEGER,INTENT(in) :: n1, n3 
    REAL :: x(n1,n3) 
    PRINT*,'------------------------------------' 
    PRINT*,SHAPE(x) 
    PRINT*,SIZE(x) 
    END SUBROUTINE sub2 
END MODULE subs 


PROGRAM nosize 
    USE subs 
    IMPLICIT NONE  
    INTEGER :: n1 = 2, n2 = 2, n3 = 0 
    REAL,ALLOCATABLE :: x(:,:,:) 

    ALLOCATE(x(n1,n2,n3)) 
    x(:,:,:) = -99.9 

    PRINT*,'ALLOCATED? ',ALLOCATED(x) 
    PRINT*,'SHAPE =',SHAPE(x) 
    PRINT*,'SIZE =',SIZE(x) 
    PRINT*,'X  =',x 

    CALL sub1(x(:,1,:)) 
    CALL sub2(n1,n3,x(:,1,:)) 

END PROGRAM nosize 

답변

3

인텔의 포트란 컴파일러에 -check bounds를 지정해도 문제가되지 않습니다. 제 경험상 매우 엄격한 IBM의 xlf도 -qcheck에 불만을 표시하지 않았습니다.

그러나 더 광범위하게는 그렇습니다. 범위 검사가 수행해야하거나 수행해서는 안되는 것에 대한 표준은 없습니다. 나는 왜 어떤 컴파일러가 왜 플래그가 길이가 0 인 배열에 bad/wrong/weird인지 지정하는 이유를 알 수 있습니다. 그것은 이상한 구석이다.

+2

그래, 그게 내가 썬이 뚜렷한 행동을했다는 의심을 품은 것이다. 오, 음, 표준 준수 검을 휘두르는 대신 모듈에 서브 루틴을 여러 줄로 묶어 코드 소유자를 설득해야한다는 것을 의미합니다. – Deditos