5

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()これは、 の自動配列仮引数を使用するの呼び出しのエラーですxsub1()呼び出しは、コンパイラとフラグのどちらでも正常に実行されます。

私の知る限り、このプログラムは「合法的」です。サイズがゼロの配列は、サイズがゼロでない配列のように参照される可能性があり、長さがゼロの次元の明示的なインデックスはありません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
4

1 に答える 1

4

-check bounds を使用した intel の fortran コンパイラでは問題が発生しません。そして、私の経験では非常に厳格な IBM の xlf も、-qcheck に文句を言いませんでした。

しかし、より広く言えば、はい、境界チェックが何をすべきか、何をすべきでないかについての標準はありません。一部のコンパイラが長さ 0 の配列への代入を悪い/間違っている/奇妙であるとフラグを立てる理由は確かにわかります。それは奇妙なコーナーケースです。

于 2011-04-12T14:16:12.503 に答える