- ベストアンサー
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]
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
FORTRANでは、型宣言を明示的に行わなければ、i~nで名前が始まる変数は整数型、それ以外は実数型になります。 今回のケースでは、サブルーチン側の変数a、bは、COMMONでもなく、内部サブルーチンでもないので、メイン側の変数a、bとは別の領域になっています。 メイン側では整数型を明示宣言、サブルーチン側では型宣言なしで実数型となるので、コンパイラが警告を表示してくれたということです。
その他の回答 (1)
- Tacosan
- ベストアンサー率23% (3656/15482)
ただの英語なんだけど, それでも理解できない? メインの実引数とサブルーチンの仮引数で型が違ってます, って言ってる. このままでいいかどうかはサブルーチンの処理の内容によるけどそれはこちらで知る由もないので自分で考えること.
お礼
回答ありがとうございます。 ためしに integer a,b を削除したら何もなくなりました。 でもなぜ直ったのかどうかわかりません。 integerは使えないということなんでしょうか。 でも、何も書かない状態はこの場合整数型ですよね・・・。 subroutinの内容ですが、 質問文のプログラム中に subroutine sub(a,b) write(*,*) ,'No.2' return end ただ「No2」と書くだけです。特にこれといった目的はありません。
補足
実数型ですね
お礼
回答ありがとうございます。 納得できました。 自分で勝手に勘違いしてややこしくなってたみたいでした。