• ベストアンサー

fortran subroutineについて

fortran subroutineについて c c c kk.f c c integer a,b a=0 do 10 b=1,9,2 a=a+1 print * ,a 10 continue write(*,*) ,'No.1' call sub(a,b) stop end c subroutine sub(a,b) write(*,*) ,'No.2' return end  簡単に上記のようにつくってg77でコンパイルしたのですが、call文とsubroutine文の部分で警告が出ました。  実行ファイルは問題なく動作をするのですが、このままでもいいのでしょうか?ちなみに、警告文を読んでも僕には理解できませんでした。  以下、警告文です。 kk.f: In subroutine `sub': kk.f:13: warning: call sub(a,b) 1 kk.f:17: (continued): subroutine sub(a,b) 2 Argument #1 (named `a') of `sub' is one type at (2) but is some other type at (1) [info -f g77 M GLOBALS] kk.f:13: warning: call sub(a,b) 1 kk.f:17: (continued): subroutine sub(a,b) 2 Argument #2 (named `b') of `sub' is one type at (2) but is some other type at (1) [info -f g77 M GLOBALS]

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

  • ベストアンサー
回答No.2

FORTRANでは、型宣言を明示的に行わなければ、i~nで名前が始まる変数は整数型、それ以外は実数型になります。 今回のケースでは、サブルーチン側の変数a、bは、COMMONでもなく、内部サブルーチンでもないので、メイン側の変数a、bとは別の領域になっています。 メイン側では整数型を明示宣言、サブルーチン側では型宣言なしで実数型となるので、コンパイラが警告を表示してくれたということです。

xmanabix
質問者

お礼

回答ありがとうございます。 納得できました。 自分で勝手に勘違いしてややこしくなってたみたいでした。

その他の回答 (1)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

ただの英語なんだけど, それでも理解できない? メインの実引数とサブルーチンの仮引数で型が違ってます, って言ってる. このままでいいかどうかはサブルーチンの処理の内容によるけどそれはこちらで知る由もないので自分で考えること.

xmanabix
質問者

お礼

回答ありがとうございます。 ためしに integer a,b を削除したら何もなくなりました。 でもなぜ直ったのかどうかわかりません。 integerは使えないということなんでしょうか。 でも、何も書かない状態はこの場合整数型ですよね・・・。 subroutinの内容ですが、 質問文のプログラム中に subroutine sub(a,b) write(*,*) ,'No.2' return end ただ「No2」と書くだけです。特にこれといった目的はありません。

xmanabix
質問者

補足

実数型ですね

関連するQ&A

  • FORTRANのwarning

    fortranの勉強を最近始めたのですが 次のような警告が出てきます。 警告なので無視。ということもありなのかもしれませんがやはりないにこしたことはないのでなんとか消したく試行錯誤してみたのですがどうにも消えません。 どのようにしたらよいのでしょうか? エラーの内容は以下のとおりです In the call to (SUBROUTINE名), actual argument #1 does not match the type and kind of the corresponding dummy argument. fortranに詳しい方どうかよろしくお願いします

  • fortran77教えてください

    fortran77のプログラムについての質問です。 次のプログラムを実行するとどのような結果になるか教えてください REAL A,B,C,D,E,F A=7.0 B=5.0 CALL WASA(A,B,C,D) CALL WASA(C,D,E,F) WRITE(*,*)E,F STOP END SUBROUTINE WASA(P,Q,R,S) REALP,Q,R,S R=P+Q S=P-Q RETURN END

  • fortran 外部サブルーチンの読み込みについて

    c c main.f c dimension x(2) x(1)=1 x(2)=2 y=5 call sub(x,y,z) write(*,*)'x1=',x(1) write(*,*)'x2=',x(2) write(*,*)'y=',y write(*,*)'z=x1+x2+y=',z stop end c---------------------------------- c sub.f c subroutine sub(a,b,c) dimension a(2) c=a(1)+a(2)+b write(*,*)'b=',b return end  以上のようなプログラムをmain.fとsub.fに分離して、別々にコンパイル。最後にそれぞれの実行ファイルをつなげるといったことがしたいのですが、どのようにすればいいのでしょうか。 サブルーチンをメインプログラムが参照するといったことがしたいです。

  • FORTRAN subroutineと配列と繰り返し

     以下のように二次元配列の場合でsubroutineを使うときに、主プログラムで2重Doループ(iとj)で繰り返しをしているのですが、すでにsubroutineでDoループ(i)を用いて計算しています。これではsubroutineの利点をうまく使えていないと思うのですが、subroutineを使って配列、Doループをきれいにする方法をどなたか教えていただけませんか。  実際は4重ループ、4次元配列なので、プログラムをわかりやすくするためにサブルーチンを使いたいと思っています。 -------------------------------------------------------------- program S real,dimension(5,5) :: B real,dimension(5) :: A integer :: i,j do j=1,5 CALL sub1(A) do i=1,3 B(i,j)=A(i)*j write(*,*) B(i,j) end do end do end program S subroutine sub1(A) real,dimension(5) :: A integer :: i do i=1,3 A(i)=3.*i end do end subroutine sub1

  • FORTRAN…これってどんなプログラムになりますか??

    DO 10 I=1,47 CALL SUB1 10 CONTINUE STOP END SUBROUTINE SUB1 DIMENSION B1(3),B2(3),C(3),L(3),P(3) CHARACTER*12 A READ(5,50) A,B1,B2 50 FORMAT(A12,3F8.1,3F7.1) X=1.0 DO 11 K=1,300 Y1=(-1.0) Y2=0.0 DO 12 J=1,3 L(J)=(-NINT(B1(J)*10.0/B2(J))) Y1=Y1+X**L(J) Y2=Y2+L(J)*X**(L(J)-1) 12 CONTINUE W=X-Y1/Y2 IF(ABS(W-X).LT.1E-10) GO TO 13 X=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 D=0.0 DO 16 J=1,3 P(J)=B2(J)/R1 D=D+P(J)*ALOG(P(J)/C(J)) 16 CONTINUE E=0.0 DO 17 J=1,3 E=E+(B1(J)/B2(J)*P(J)) 17 CONTINUE WRITE(*,200) A,B2,P,E,D 200 FORMAT(1H,2X,A12,3X,3(F7.1,2X),4X,3(F9.6,X),4X,F9.6,2X,F9.6) RETURN END

  • f90で構造体を引数で渡す

    次のようなF90のテストコードがあります。 これをフリーソフトのGFORTRANでコンパイルすると CALL SUB(STR) Warnig:Type mismatch in argument 'str' at(1);passed TYPE(tp_str) to TYPE(tp_str)[Wargument-mismatch] なる警告がでます。構造体を引数で渡す方法に誤りがあるようなのですが、なぜダメなのでしょうか。 PROGRAM TEST IMPLICIT NONE TYPE TP_STR   INTEGER I ENDTYPE TYPE (TP_STR) :: STR STR%I = 1 CALL SUB(STR) STOP END SUBROUTINE SUB(STR) IMPLICIT NONE TYPE TP_STR   INTEGER I ENDTYPE INTEGER X TYPE (TP_STR) :: STR X = STR%I RETURN END

  • fortran 配列受け渡し時の次元の一致

    fortran90、コンパイラはifortです。 普通メインプログラムとサブルーチン間での配列の受け渡しは、次元を揃えて渡すと思います。 とあるコード(以後コードA)を読んでいると、2次元配列を渡し、1次元配列で受け取っていました。 例 program test1 integer :: a(3,3) call testsub(a) end program subroutine testsub(b) integer :: b(9) end subroutine これが受け取り側でどう処理されているのかわからず、調べるために適当なテストコードを書きました。 a 123 456 789 ↓ b 123456789 になるとか 結果、コンパイルは通ったのですがサブルーチン側では全て0で置き換えられてしまいました。 コードAはpgiかなんかでコンパイルしていたようなのでコンパイラの違いでしょうか? よくわらなかったので質問させて頂きました。 質問をまとめますと、 (1)次元の異なる配列の受け渡しができるかどうか (2)その場合中身はどうなるか よろしくお願いします。 ---以下テストコード--- program testa implicit none integer :: a(3,3),i,j do i=1,3 do j=1,3 a(i,j)=j+(i-1)*3 enddo enddo do i=1,3 do j=1,3 write(6,*) a(i,j) enddo enddo call sub1(a) end program subroutine sub1(b) integer :: b(9),i do j=1,9 write(6,*) b(i),'sub' enddo end subroutine

  • fortranで・・・

    実行の画面に数字を入力すると、 英語の文章と 0.0 0.0 0.0 -NaN -NaN -NaN という文字が出てくるだけなんですが、これはプログラムが組めていないということなのでしょうか? ちなみに、打ったプログラムは、 C 判別関数 WRITE(*,100) 100 FORMAT(1H1/22X,'判別関数モデル'//19X,'消費量',3X,'消費比率'//19X, +'清酒',5X,'焼酎',5X,'ビール',7X,'清酒',6X,'ビール',7X,'M'10X,'D'/ +/) DO 10 I=1,47 CALL SUB1 10 CONTINUE STOP END SUBROUTINE SUB1 DIMENSION B1(3),B2(3),C(3),L(3),P(3) CHARACTER*12 A READ(5,50) A 50 FORMAT(3F8.1,3F7.1) X=1.0 DO 11 K=1,300 Y1=(-1.0) Y2=0.0 DO 12 J=1,3 B2=0.0 B1=0.0 L(J)=(-NINT(B1(J)*10.0/B2(J))) S1=Y1+X**L(J) S2=Y2+L(J)*X**(L(J)-1) Y1=S1 Y2=S2 12 CONTINUE W=X-Y1/Y2 IF(ABS(W-X).LT.1E-10) GO TO 13 X=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 D=0.0 DO 16 J=1,3 P(J)=B2(J)/R1 DO=D+P(J)*ALOG(P(J)/C(J)) D=DO 16 CONTINUE E=0.0 DO 17 J=1,3 EO=E+(B1(J)/B2(J)*P(J)) E=EO 17 CONTINUE WRITE(*,200) A,B2,P,E,D 200 FORMAT(1H,2X,A12,3X,3(F7.1,2X),4X,3(F9.6,X),4X,F9.6,2X,F9.6) RETURN END です。

  • C言語のバグの警告文について

    こんばんわ。 C++でプログラムを作成中なのですが警告文の意味がわからないので教えていただきたいです。 警告文 SAMPLE.c: 181 : warning: passing argument 4 of fwrite' makes pointer from integer without a cast /usr/include/stdio.h:688: note: expected 'struct FILE * __restrict__' but argument is of type 'int' どうぞよろしくお願いいたします。

  • 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

専門家に質問してみよう