GNU Fortran (v4.4.3) または Sun Studio F95 (v8.3) でコンパイルし、配列の範囲をチェックしない場合、次のプログラムはエラーなしで実行されます。ただし、配列境界チェックがオンになっている場合 (それぞれgfortran -fbounds-check
およびf95 -C
)、GNU コンパイル済み実行可能ファイルはエラーなしで再度実行されますが、Sun Studio コンパイル済み実行可能ファイルは実行時エラーが発生します。
****** 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'
sub2()
これは、 の自動配列仮引数を使用するの呼び出しのエラーですx
。sub1()
呼び出しは、コンパイラとフラグのどちらでも正常に実行されます。
私の知る限り、このプログラムは「合法的」です。サイズがゼロの配列は、サイズがゼロでない配列のように参照される可能性があり、長さがゼロの次元の明示的なインデックスはありませんx
。しかし、ここで見逃している、サイズがゼロの配列スライスまたは自動配列の繊細さはありますか? また、配列境界チェックが異なるコンパイラ間で同じように動作することを期待する必要がありますか、それともベンダー固有の拡張機能と見なす必要がありますか?
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