GNU Fortran (v4.4.3) 또는 Sun Studio F95 (v8.3)로 컴파일하고 배열 범위를 검사하지 않으면 다음 프로그램이 오류없이 실행됩니다. 배열 범위 검사가 (각각 gfortran -fbounds-check
및 f95 -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
그래, 그게 내가 썬이 뚜렷한 행동을했다는 의심을 품은 것이다. 오, 음, 표준 준수 검을 휘두르는 대신 모듈에 서브 루틴을 여러 줄로 묶어 코드 소유자를 설득해야한다는 것을 의미합니다. – Deditos