- 締切済み
fortranエラーに・・・なってしまいます
DIMENSION B1(3),B2(3),C(3),L(3),P(3),AS(3,7),X(7),HSI(3) CHARACTER A*12 READ(5,50)A 50 FORMAT(A12) READ(5,100)B1,B2 100 FORMAT(3F8.1,3F7.1) Z=1.0 DO 11 K=1,300 Y1=(-1.0) Y2=0.0 DO 12 J=1,3 L(J)=(-NINT(B1(J)/B2(J))) S1=Y1+Z**L(J) S2=Y2+L(J)*Z**(L(J)-1) Y1=S1 Y2=S2 12 CONTINUE W=Z-Y1/Y2 IF(ABS(W-Z).LT.1E-10) GO TO 13 Z=W 11 CONTINUE 13 WO=W DO 14 J=1,3 C(J)=WO**L(J) 14 CONTINUE R1=0.0 DO 15 J=1,3 R2=R1+B2(J) R1=R2 15 CONTINUE P(1)=B2(1)/R1 P(2)=B2(2)/R1 P(3)=B2(3)/R1 AS(1,1)=1.0 AS(1,2)=0.0 AS(1,3)=0.0 AS(2,1)=0.0 AS(2,2)=1.0 AS(2,3)=0.0 AS(3,1)=0.0 AS(3,2)=0.0 AS(3,3)=1.0 AS(1,6)=0.0 AS(1,7)=C(1) AS(2,5)=0.0 AS(2,7)=C(2) AS(3,4)=0.0 AS(3,7)=C(3) CALL SUB2(B1(1),B2(1),B1(2),B2(2),AS(1,4),AS(2,4)) CALL SUB2(B1(1),B2(1),B1(3),B2(3),AS(1,5),AS(3,5)) CALL SUB2(B1(2),B2(2),B1(3),B2(3),AS(1,6),AS(3,6)) DO 17 J=1,7 X(J)=0.1428
- みんなの回答 (3)
- 専門家の回答
みんなの回答
#2です。 ちょっと回答にミスがありました。 3)の箇所ですが、CALL文をよく見ると、引数を配列として引き渡していないので、サブルーチン内で配列宣言をする必要はありませんでした。 また、ここはなおした方がよいと思います。 200 FORMAT(1H,X,A12,X,3(F8.5,X),X,4(F8.5,X)) ↓ 200 FORMAT(1H ,1X,A12,1X,3(F8.5,1X),1X,4(F8.5,1X)) 1Hのあとにブランクを入れる。入れないとカンマが出力されます。 Xの前に1を入れる(Xのままでも動くようですが) これを修正した結果、実行したところ以下のようになりましたので、検証してみてください。 画面入力データ TESTTEST.DAT 3,3 4,5 6,6 画面出力 TESTTEST.DAT 0.03054 0.26751 0.29002 0.09039 0.09411 0.09411 0.13332
#1です。文法的におかしいところがあり、エラーは実行時に出るものでなく、コンパイル時に出るものですね。 3箇所新たに間違いを見付けました。 1) CHARACTER A*12 表記ミスです。 CHARCTER*12 A Aは12字の文字型変数ですね。 2)以下の部分 21 CONTINUE 20 CONTINUE 22 CONTINUE WRITE(*,200)A,(X(J),J=1,7) 200 FORMAT(1H,X,A12,X,3(F8.5,X),X,4(F8.5,X)) RETURN END メイン分なので、RETURNではなく、STOPです。 RETURNはサブルーチンのEND分の前に使うものです。 3)サブルーチンについて サブルーチン内で配列宣言が必要です。 コンパイル時にはエラーが出なくても引数の引き渡しがうまくいかず解析結果がおかしくなります(#1のも実行時にエラーがでると思います)。 これらを訂正してコンパイルしたところ、エラーは出ませんでした。なお、実行時については未確認です。
以下がおかしいと思います。 READ(5,100)B1,B2 B1、B2は配列なのに配列として読み込んでいないので、B2(1)=0となり結果としてR1が0になり、以下の場所で0割が生じているのではないでしょうか? R1=0.0 DO 15 J=1,3 R2=R1+B2(J) R1=R2 15 CONTINUE P(1)=B2(1)/R1 P(2)=B2(2)/R1 P(3)=B2(3)/R1 AS(1,1)=1.0 おそらく以下のようにすればよいと思います。 DO 1 I=1,3 READ(5,100) B1(I),B2(I) 1 CONTINUE 他に考えられるとしたら、サブルーチンでの引数が一致していないことぐらいでしょう。 上記でうまくいかない場合、エラーメッセージを補足願います。
補足
DO 17 J=1,7 X(J)=0.1428 17 CONTINUE DO 22 N=1,1000 DO 18 M=1,3 T1=0.0 DO 19 J=1,7 T2=T1+X(J)*AS(M,J) T1=T2 19 CONTINUE HSI(M)=T1 18 CONTINUE DO 20 J=1,7 DO 21 M=1,3 X1=X(J)*(P(M)/HSI(M))**AS(M,J) X(J)=X1 21 CONTINUE 20 CONTINUE 22 CONTINUE WRITE(*,200)A,(X(J),J=1,7) 200 FORMAT(1H,X,A12,X,3(F8.5,X),X,4(F8.5,X)) RETURN END SUBROUTINE SUB2(A,B,C,D,E,F) G(X,Y,Z)=X*(-NINT(Y/Z)) GD(X,Y,Z)=(-NINT(Y/Z))*X**(-NINT(Y/Z)-1) X=1.0 DO 10 K=1,300 W=X-(G(X,A,B)+G(X,C,D)-1.0)/(GD(X,A,B)+GD(X,C,D)) IF(ABS(W-X).LT.1E-10) GO TO 11 X=W 10 CONTINUE 11 E=G(W,A,B) F=G(W,C,D) RETURN END が、質問の続きです。
補足
ありがとうございます。おかげさまで翻訳はできたのですが、実行画面で数字を入力しても、 同じ数字繰り返し表示されるだけなのですが・・・これはどうしてなんでしょうか?