プロが教えるわが家の防犯対策術!

fortranの配列宣言について質問です。
下記の様に配列の変数をサブルーチンの内外で宣言することで違いが出てきました。
こういうものなのでしょうか。失礼します。


parameter(ine=4999)
c
call test1(ine) !error
call test2() !OK

stop
end

subroutine test1(ine)
dimension ary1(ine,50)

return
end

subroutine test2()
parameter(ine=4999)
dimension ary1(ine,50)

return
end

A 回答 (4件)

着目すべき点は、おそらく二点。



1.もともとFortranは、サブルーチン・関数の引数は参照渡しが基本だそうです。その場合、定数を渡すことができるのか?

 参照渡しというのは、誤解を恐れずに言うと、変数のアドレスを渡すこと。定数には通常アドレスはありません。強いて言うと(これが問題ですが)、変数の場合は変数のセグメントにあるアドレスが渡されますが、定数の場合コードセグメントのアドレスが渡される可能性があります。一般的にはこれは実行時エラーを引き起こします。親切な処理系なら、コンパイル時にエラーで蹴られます。

2.もし、それを受け取ることができたとしたら、次の難関は、配列宣言のサイズを変数で動的に指定できるのか?

 明示的にメモリを確保するアロケート系の処理以外では、通常名前をつけて宣言する変数は、コンパイル時に大きさが決定している必要があります。test1版の配列宣言は、一つ目の引数が、サブルーチンの引数として宣言された変数になっています。
これは実行時まで内容が決まりません。

以上、通りすがりの者Fortranはやったこと無い者ですが、気になった点です。
    • good
    • 0
この回答へのお礼

詳しい解説ありがとうございました。
「つまり、大きさが決まっていない配列を無理やり宣言したため。」ということでしょうか。

エラーの無い方法でコードを書こうと思います。
ありがとうございました。

お礼日時:2011/04/12 20:41

call test1(ine)でエラーとなり、call test2() でエラーにならない理由はおそらく以下の通りです。



まずtest1内の配列ary1は引数としてわたってくるineの大きさに基づくものですので
可変サイズ(実行時までサイズが不明な)配列という扱いになります。
一方でtest2内の配列ary1は固定サイズ(コンパイル時にサイズが既知な)配列
という扱いになり、この違いがtest1ではスタックオーバーフローを引き起こし
test2ではエラーにならないことの理由かと思います。

test1は外部サブルーチンであり引数ineに何が渡って来ても正しく動作する必要があります。
(つまり実行時までtest1内のary1の大きさを決定することができません)
ですのでtest1内のary1の領域は実行時にスタック上に確保されることになりますが
おそらく、ご利用の環境においてのスタックサイズが十分に大きくない事により
スタックオーバーフローが発生しているのではないかと推測されます。

test2ではなぜエラーにならないかという点ですが、test2内において
ary1の大きさ(50x4999)は(実行時まで待つことなく)
コンパイル時に既に決定しています。そのためご利用のコンパイラでは
test2のary1の領域を静的に(スタック上にではないところに)用意しています。
これによりtest2ではスタックサイズに関係なくary1の領域が確保され、よって
エラーが発生しないという事になっているのかと思います。

以上ご参考になれば幸いです。
    • good
    • 0
この回答へのお礼

詳しい解説ありがとうございました。
「つまり、大きさが決まっていない配列を無理やり宣言したため。」ということでしょうか。

エラーの無い方法でコードを書こうと思います。
ありがとうございました。

お礼日時:2011/04/12 20:41

あぁそうだ,


・その「エラー」とやらがいつ出るのか (コンパイル時・実行時・その他 (できるだけ詳しく))
・(あるなら) エラーメッセージを「一字一句そのまま」
も情報としてあるべきでしょう.
    • good
    • 0

処理系は?


その処理系が従っている規格は?
その規格をじっくり読んで, それでも理解できなかったってこと?

この回答への補足

2003年に購入したintelのfortranです。

以前からこういう症状があったのかもう一度確認してみます。

補足日時:2011/04/12 00:07
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!