0

私は Fortran が初めてで、この問題があります。

私がこのDOを実行したときは大丈夫です:

integer, parameter :: Int10Type = selected_int_kind (10)
INTEGER (Int10Type), PARAMETER :: TOTAL_TIME = 1000, TOTAL_INI = 200
INTEGER (Int10Type):: t, z
REAL (16), DIMENSION(TOTAL_Z, TOTAL_TIME) :: current
DO t = 1, TOTAL_TIME
   current(TOTAL_Z, t) = TEMP_INI
END DO
DO t = 1, TOTAL_TIME - 1
  DO z = 2, (TOTAL_Z - 1)
    current(z, t + 1) = current (z, t) + KAPPA*DELTA_T*((current(z - 1, t) -2.0*current(z, t) + current(z + 1, t)) / DELTA_Z**2)
  END DO
END DO

しかし、var limiteをインクリメントすると

    integer, parameter :: Int10Type = selected_int_kind (10)
INTEGER (Int10Type), PARAMETER :: TOTAL_TIME = 1000000000, TOTAL_INI = 200
INTEGER (Int10Type):: t, z
REAL (16), DIMENSION(TOTAL_Z, TOTAL_TIME) :: current
DO t = 1, TOTAL_TIME
   current(TOTAL_Z, t) = TEMP_INI
END DO
DO t = 1, TOTAL_TIME - 1
  DO z = 2, (TOTAL_Z - 1)
    current(z, t + 1) = current (z, t) + KAPPA*DELTA_T*((current(z - 1, t) -2.0*current(z, t) + current(z + 1, t)) / DELTA_Z**2)
  END DO
END DO

プログラムの出力が「強制終了」されるのは
なぜですか? 私は何を悪いのですか?

4

1 に答える 1

1

integer(10)integer(kind=10)少なくとも 10 桁の整数ではないことを意味します。kind=10 が何を意味するかはコンパイラ次第です。kind=10 が存在するという保証はありません! 10 桁の 10 桁を指定する場合は、次を使用する必要があります。

integer, parameter :: Int10Type = selected_int_kind (10)
integer (kind=Int10Type) :: i

次に、プログラムを次のように記述します。

integer, parameter :: Int10Type = selected_int_kind (10)

INTEGER (Int10Type), PARAMETER :: limite = 1000000000_Int10Type, lim = 200
INTEGER (Int10Type):: i, j
DO i = 1, limite
  DO j = 1, lim
     !I work with a matrix
  END DO
END DO

大きな定数値にも型が指定されていることに注意してください。

または、コンパイラが Fortran 2003 の ISO Fortran 環境機能を提供している場合は、移植可能な方法で 8 バイト (64 ビット) の整数を要求できます。

use iso_fortran_env

INTEGER (INT64), PARAMETER :: limite = 1000000000_INT64, lim = 200
INTEGER (INT64):: i, j
DO i = 1, limite
  DO j = 1, lim
     !I work with a matrix
  END DO
END DO

2**31 = 2,147,483,648 なので、PS 1000000000 は 4 バイトの (符号付き) 整数に収まる必要があるため、ほとんどの Fortran コンパイラのデフォルトの整数が機能するはずです。おそらくinteger、種類を指定せずにそのまま使用できます! で十分ですiso_fortran_envINT32これで問題が解決しない場合は、配列が大きすぎる可能性があります。さらにコードを表示する必要があるかもしれません。

PPS 追加のソース コードへの対応。do ループはt1 からtotal_timeになりますが、2 番目のインデックスを として使用します。t+1つまり、最大値は になりますtotal_time+1。これは の 2 次元を超えていcurrentます。配列の添字エラーがあります。添え字境界チェックを使用してコンパイルすると、コンパイラがこれを見つけます。gfortran では、-fcheck=all または -fbounds-check を使用します。

于 2013-03-05T08:01:41.913 に答える