3

少し特殊な FORTRAN でプログラムを実行しています。私は整数変数しか使用できません。ご存知のように、12 または 13 より大きい階乗を計算しようとすると、メモリ オーバーフローが発生します。この問題を回避するために、次のプログラムを作成しました。

http://lendricheolfiles.webs.com/codigo.txt

しかし、非常に奇妙なことが起こっています。プログラムは階乗を 4 回または 5 回計算し、メモリ オーバーフロー メッセージを表示します。私は Windows 8 を使用していますが、それが失敗の原因である可能性があるのではないかと心配しています。

ありがとう。

4

2 に答える 2

2

実行時の添え字チェックを使用してコンパイルしてみてください。Fortranのセグメンテーション違反は、一般に、添え字エラー、または実際の引数とダミーの引数の間の不一致(つまり、プロシージャの呼び出しの引数とプロシージャで宣言された引数の間)のいずれかによって発生します。添え字エラーがあることをコードを一瞥することから、大げさな推測をします。実行時の添え字チェックをオンにして、コンパイラーにそれを見つけさせます。ほとんどのFortranコンパイラには、コンパイルオプションとしてこれがあります。

PSすでに作成されたパッケージを使用して、このような計算を行うこともできます。たとえば、Fortran 90( http://crd-legacy.lbl.gov/~dhbailey/mpdist)で入手可能なDavid Bailey、etal。の任意精度演算ソフトウェアです。//

于 2012-12-12T00:13:08.603 に答える
1

MSB の答えには、問題の要点があります。配列インデックスがいくつかの場所で範囲外になります。

3 つのループでcifra - 1 == 0は、範囲外です。

do cifra=ncifras,1,-1
  factor(1,cifra-1) = factor(1,cifra)/10    ! factor is (1:2, 1:ncifras)
  factor(1,cifra) = mod(factor(1,cifra),10)
enddo 
! :
! Same here:
do cifra=ncifras,1,-1
 factor(2,cifra-1) = factor(2,cifra)/10
 factor(2,cifra) = mod(factor(2,cifra),10)
enddo
!:
do cifra=ncifras,1,-1
  sumaprovisional(cifra-1) = sumaprovisional(cifra-1)+(sumaprovisional(cifra)/10)
  sumaprovisional(cifra) = mod(sumaprovisional(cifra),10)
enddo

次のケースでは、 の値がcifra - (fila - 1)範囲外になります。

do fila=1,nfilas
  do cifra=1,ncifras  
    ! Out of bounds for all cifra < fila:
    sumando(fila,cifra-(fila-1)) = factor(1,cifra)*factor(2,ncifras-(fila-1))
  enddo
  sumaprovisional = sumaprovisional+sumando(fila,:)
enddo

do cifra = ncifras, 2, -1最初の 3 つのループを として、他のケースの内側のループをとして書き直せば問題ないはずですdo cifra = fila, ncifras。また、投稿したサンプルプログラムではresultado、サブルーチンに渡す前にまず適切に割り当てる必要があります。

于 2012-12-12T22:03:51.577 に答える