1

次の Fortran コードがインテル Fortran Composer 2013 で実行されると、コンパイラーは書き込み関数でブレークポイントをトリガーし、コード 408 を返します。

       character*20  date_char
       character*10  LADATE

       ...
       if (date_char(3:3) .EQ. "") date_char(3:3)="0"
       if (date_char(7:7) .EQ. "") date_char(7:7)="0"
       write(LADATE,"(2A2,A4)")
     S date_char(3:4),date_char(7:8),date_char(9:12)

これは固定行長形式で、S は行の継続を表します。

date_char の値は ' 29 012013 ' で、LADATE の値は ' ' です。

書き込みステートメントに到達するとすぐに、デバッガーはブレークポイントをトリガーし、コール スタックは次のシステム関数が呼び出されていることを示します。

for _issue_diagnostics() _for_emit_diagnostics()

あなたの時間を大切にします

4

1 に答える 1

2

問題は、LADATE 変数が実際には参照渡しの引数 (FORTRAN77 のデフォルトの受け渡し規則) だったことです。

   SUBROUTINE MDATE(LADATE)

   character*20  date_char
   character*10  LADATE
   ...
   write(LADATE,"(2A2,A4)")
 S date_char(3:4),date_char(7:8),date_char(9:12)

   RETURN
   END

そして、上記のいくつかのサブルーチンの引数として、8 文字の文字列として渡されました。簡単に書くと、呼び出しは次のようになります。

   ...
   CHARACTER VAR*20
   ...
   CALL MDATE(VAR(10:17))
   ...

プログラムは開始されましたが、書き込み関数によってアクセスできない配列アドレスにアクセスしようとした後、ブレークポイントがトリガーされました。

于 2013-01-30T09:19:25.360 に答える