• ベストアンサー

Fortranコードの疑問

FORTRANのコードに関して教えてください。 いま作っているプログラムを走らせるとCommand terminated abnormally.と言われて途中で止まってしまいます。これは小さな計算(2000格子点)くらいだと上手くいくのですが、16000格子点くらいになるとダメです。これくらいだとメモリ的にもまだまだ余裕があるので、色々と他の理由を探してみましたが万策尽きました・・・ どうやら write(*,*)n…繰り返し数 n=2000 write(*,*)n do i=1,n -- code ----- enddo としたとき、出力は普通、 0 2000 となってDo文を実行すると思うのですが、上記の場合のように大きな(?)計算をさせようとすると、 1081265151 2000 などと、定義してもいないのにとんでもない値がnに代入されてしまうようです。何故このような現象が起こるのかご存知の方がいらっしゃいましたら、どうかご教示頂けると幸いです。

質問者が選んだベストアンサー

  • ベストアンサー
  • rinkun
  • ベストアンサー率44% (706/1571)
回答No.1

FORTRANの文法を良く思い出せないので自信ないですが、一般論としては初期化していない変数がどんな値を持つかは不定です。 初期値が0になっていることを仮定してコードを書くと嵌まります。 質問の主旨がそういう話でなかったらごめんなさい。

fortran1234
質問者

お礼

全くその通りでした。すべての変数を初期化したところ正常に動作しました。ありがとうございました!

その他の回答 (1)

  • ultraCS
  • ベストアンサー率44% (3956/8947)
回答No.2

#1の方のおっしゃるとおりです、FORTRANの仕様では、変数の初期値は定められておらず、宣言しただけでは不定です。 実際の処理系によっては、ヌルでクリアされることもありますが、それに頼ったプログラミングはFORTRANに限らず悪い癖ですので直すようにしてください。いままでに、これが動かない原因だったシステムはたくさんあります。 ただし、書かれているコードであれば、それが原因でABENDというようなものには思えません。--code--の部分に別の問題がありそうです。

fortran1234
質問者

お礼

これまでの経験では、ヌルでクリアされていたため、気付きませんでした…これからは気をつけるようにします。ありがとうございました!

関連するQ&A

  • fortran90 の簡単なコード

    初めて質問させていただきます。 fortran を使い15を任意の数で割るプログラムを作成しようとしているのですが 実行時に n を read し結果を書き出すとn+1個の数値が書き出されてしまいます。かつ、n+1個目の数が全く予想しない数値になってしまいます… コンパイルエラーは発生しません。 初心者なりにひとつひとつ精査したのですが原因がわかりません。 お助けください、よろしくお願いいたします。 画像:実行時n=10としたときの例 PROGRAM work6 IMPLICIT NONE REAL , ALLOCATABLE :: x(:) REAL :: dx INTEGER :: n PRINT *,' How many numbers do you separate it? ' READ(*,*) n ALLOCATE (x(n)) dx=15.0/REAL(n) do n=1,n x(n)=dx*REAL(n) enddo  PRINT *,x(1:n)  READ (*,*) ENDPROGRAM work6

  • 院試の問題(FORTRAN)で。

    FORTRANを昨日勉強し始めたばかりの初心者です。 とある大学院の試験問題でわからない部分があるので質問させていただきます。 問題文とソースは以下のとおりです。 以下のFORTRANプログラムについて、標準出力への出力を答えよ。 program main intger :: m(3,3),i,j,k,n n=3 m(1,1)=2; m(1,2)=1; m(1,3)=2 m(2,1)=2; m(2,2)=3; m(2,3)=12 m(3,1)=8; m(3,2)=-6; m(3,3)=2 do i=1,n-1 do j=i+1,n m(j,i)=m(j,i)/m(i,i) ← do k=i+1,n m(j,k)=m(j,k)-m(j,i)*m(i,k) enddo enddo enddo write(6,*) m(2,1),m(2,3),m(3,2),m(3,3) end これを計算していくとm(2,2)=0(計算ミスだったらすみません)となってしまって 上のソースの矢印の部分でエラーが出てしまうと思い、 それだと出力出来ないのではないかと思ったんですが、 それでは答えにならないので質問させていただきました。 コンパイラを使って実行してみたいのもやまやまなんですが、 なにしろ試験まで時間があまりないもので・・・ どなたか回答できる方いらっしゃいましたらよろしくお願いします!

  • Fortran90/95の出力方法について

    Fortran90/95の出力方法について Fortran95において,変数の値をwrite文で出力した後に改行しない方法を教えてください. 具体的には次のProgram reiを用いて質問します. program rei implicit none integer i, n read(*,*) n do i = 1, n write(*,*) i end do end このプログラムを実行させnに3を代入すると次のように表示されます. 1 2 3 しかし,私としては次のように改行せずに表示させたいのです. 1 2 3 また,諸事情により配列は使用しません. プログラムをどのように改良すればよいのでしょうか.教えてください.

  • fortran 行列ベクトル積

    行列ベクトル積を計算するプログラムを下のように書いたのですが、実行した結果の答えが実際計算した答えと異なります。初期の要素の設定がおかしいのでしょうか?教えて下さい。よろしくお願いします。 program list2_14 implicit none integer , parameter :: n = 2 real(8) a(n,n), x(n), y(n) integer i, j, k, l a(1,1:2) = (/1.2d0,3.4d0/) a(2,1:2) = (/5.6d0,7.8d0/) x(:) = (/9.0d0,10.0d0/) do i = 1, n y(i) = 0.0d0 do j = 1, n y(i) = y(i) + a(i,j) * x(j) enddo enddo do k = 1, n write(*,*) (a(k,l), l = 1, n) enddo write(*,*) x(:) write(*,*) y(n) end program list2_14 実行結果 1.2 3.4 5.6 7.8 9. 10. 128.4

  • fortranで疑問

    今fortranで困ったことがあります。 例えば 1 2 3 と縦に改行されているファイルを、新しいファイルに同じ数値データを写したいとき 元のデータから read(*,*)(n,i=1,3) で値を読み込み write(*,*)(n=i,3) で新しいデータに書き込み出来る と思ったのですが 3 3 3 と新しいファイルに書き込まれてしまうのです。 まず縦に改行した形で表示するにはどうしたら良いでしょうか? ちなみにdo~continue文でプログラムするとうまくいきます。

  • fortran 配列

    はじめまして。fortranを勉強しているのですが割付け配列がよく理解できないので教えていただきたいのですが。以下に自分で作った簡単なプログラムを実行していたのですが正しい値になりません。どこが間違っているのでしょうか?教えて下さい。よろしくお願いします。 program list2_3 implicit none real(8), allocatable :: u(:), v(:) integer :: i, n = 2 real(8) dotp allocate (u(n), v(n)) u(1:2) = (/1.2d0,3.4d0/) v(1:2) = (/4.1d0,2.6d0/) dotp = 0.0d0 do i = 1, n dotp = dotp + u(n) * v(n) enddo deallocate (u, v) write(*,*) ' dot product =' , dotp end program list2_3

  • fortran 3次元座標

    四面体の4頂点の3次元座標を設定するプログラムを例にならって以下のように書いたのですが、doループの内容がいまいちよくわかりません。p(1:3,m),p(1:3,n)が表されている値は理解できるのですが、出力されたファイルの内容が2行3列の答えが6つあって、なぜそのように答えが出てくるのかがわかりません。教えて下さい。よろしくお願いします。 rogram list2_11 implicit none integer :: m, n, fno = 10 real(8) p(3,4) call random_seed call random_number(p(1:3,1:4)) open(fno, file = 'tetra.d') do m = 1, 3 do n = m+1, 4 write(fno,*) p(1:3,m) write(fno,*) p(1:3,n) write(fno,*) '' enddo enddo close(fno) end program list2_11

  • fortranのtxtファイル出力書式について

    こんにちは。 fortranのtxtファイル出力について質問させていただきます。 下記のようなコードでtxtファイルに計算結果を出力させています。(途中省略) open(20, file ='outputx1.txt') do ax1 = 1, m do ax2 = 1, l if (sum2(ax1, 1, ax2) == 1) then write(20,*) ax1, ax2 endif enddo enddo close(20) ここでm=103,l=300です。 このコードで出力すると、結果は以下のようになります。      9    293      9    294      9    295      10     97      10     98      10     99 しかし、以下のようにtxtファイルを出力したいと考えています。 9 164 9 165 9 166 10 151 10 152 10 153 *の部分を色々といじってみたのですが、うまいやり方が見つかりません。 説明不足とは思いますが、アドバイスよろしくお願いします。

  • FORTRANについて

    混乱しています。 ---------------前略-----------------------------------       dailyP=0 do kk=1,24 dailyP = dailyP + idata(kk) enddo dailyP = dailyP/10 write(99,*) iyear, ',', mon, ',', iday, ',', dailyP --------------------------後略----------------------------- としているのですが、dailyP/10の値はでていると思うのですが、write文で最後にdailyP/24と書いたり、average=dailyP/24と前述で定義し、write文にaverageを記載しても、すごい値がでます。なぜなんでしょうか?dailyP/10の値もまちがっているのではないかと不安です。前略の文が関係している可能性があれば、その旨を教えてください。

  • FORTRAN→Cに翻訳

     どなたか、次のFORTRANのプログラムを、Cに、翻訳して頂けないでしょうか。C++ではなく、Cです。ANSI準拠のCでお願いします。  プログラムの内容は、最小二乗法による計算プログラムです。MS-DOS Ver3.3~6.0の頃の、MS FORTRANコンパイラ仕様のものです。その頃持っていたFORTRANの本も処分してしまい、今からFORTRANを学びなおすのにも多大な労力と時間がかかりそうなので、Cに翻訳して頂ければ大変ありがたいです。よろしくお願いします。 (“□”はタブ) ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆ C□LEAST SQUARE APPROXIMATION □PROGRAM MAIN9 □DIMENSION X(100),Y(100),S(0:18),T(0:9),SM(10,10),TV(10),AV(10) □WRITE(*,*) 'N ?' □READ(*,*) N □WRITE(*,*) 'x1,x2,..,xn ?' □READ(*,*) ( X(I),I=1,N ) □WRITE(*,*) 'y1,y2,..,yn ?' □READ(*,*) ( Y(I),I=1,N ) □WRITE(*,*) 'M ?' □READ(*,*) M □DO 110 K=0,M*2 □□VS=0. □□DO 100 I=1,N □100□VS=VS+X(I)**K □□S(K)=VS □110□CONTINUE □□DO 130 K=0,M □□□VS=0. □□□DO 120 I=1,N □120□VS=VS+Y(I)*X(I)**K □□□T(K)=VS □130 CONTINUE □□DO 140 I=1,M+1 □□□DO 140 J=1,M+1 □□□□K=I+J-2 □□□□SM(I,J)=S(K) □140 CONTINUE □□DO 150 I=1,M+1 □150 TV(I)=T(I-1) □□CALL SIMULE( AV, SM, TV, M+1 ) □□DO 160 I=1,M+1 □160 WRITE(*,1000) I-1,AV(I) □1000 FORMAT(1H ,'A',I1,'=',F10.5) □□STOP □□END ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆

専門家に質問してみよう