
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
No.3ベストアンサー
- 回答日時:
着目すべき点は、おそらく二点。
1.もともとFortranは、サブルーチン・関数の引数は参照渡しが基本だそうです。その場合、定数を渡すことができるのか?
参照渡しというのは、誤解を恐れずに言うと、変数のアドレスを渡すこと。定数には通常アドレスはありません。強いて言うと(これが問題ですが)、変数の場合は変数のセグメントにあるアドレスが渡されますが、定数の場合コードセグメントのアドレスが渡される可能性があります。一般的にはこれは実行時エラーを引き起こします。親切な処理系なら、コンパイル時にエラーで蹴られます。
2.もし、それを受け取ることができたとしたら、次の難関は、配列宣言のサイズを変数で動的に指定できるのか?
明示的にメモリを確保するアロケート系の処理以外では、通常名前をつけて宣言する変数は、コンパイル時に大きさが決定している必要があります。test1版の配列宣言は、一つ目の引数が、サブルーチンの引数として宣言された変数になっています。
これは実行時まで内容が決まりません。
以上、通りすがりの者Fortranはやったこと無い者ですが、気になった点です。
詳しい解説ありがとうございました。
「つまり、大きさが決まっていない配列を無理やり宣言したため。」ということでしょうか。
エラーの無い方法でコードを書こうと思います。
ありがとうございました。
No.4
- 回答日時:
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の領域が確保され、よって
エラーが発生しないという事になっているのかと思います。
以上ご参考になれば幸いです。
詳しい解説ありがとうございました。
「つまり、大きさが決まっていない配列を無理やり宣言したため。」ということでしょうか。
エラーの無い方法でコードを書こうと思います。
ありがとうございました。
No.2
- 回答日時:
あぁそうだ,
・その「エラー」とやらがいつ出るのか (コンパイル時・実行時・その他 (できるだけ詳しく))
・(あるなら) エラーメッセージを「一字一句そのまま」
も情報としてあるべきでしょう.
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
End Sub が必要です。
-
Excel VABについて 下記記述が...
-
フォートランのエラーについて...
-
構造体のポインタ参照
-
文字列で入力したプログラムか...
-
コンパイルエラー
-
エクセルで特定の列が0表示の場...
-
特定のPCだけ動作しないVBAマク...
-
配列数式の解除
-
一つのTeratermのマクロで複数...
-
教えて下さい
-
メッセージボックスのOKボタ...
-
UserForm1.Showでエラーになり...
-
Excel マクロ VBA プロシー...
-
Excel・Word リサーチ機能を無...
-
ExcelのVBA。public変数の値が...
-
Excel_マクロ_現在開いているシ...
-
お助けください!VBAのファイル...
-
Excel マクロでShearePoint先の...
-
String""から型'Double'への変...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
End Sub が必要です。
-
Excel VABについて 下記記述が...
-
フォートランのエラーについて...
-
intel fortranのエラーで困って...
-
他クラスからForm1内コントロル...
-
ラズパイ上の、pythonのエラー...
-
初歩的な質問ですが・・・
-
プロシージャ名のところでエラ...
-
python プログラミング vim
-
C言語の質問です。
-
Texに詳しい方よろしくお願いい...
-
構造体のポインタ参照
-
C++のことで・・教えてください。
-
VBでエラー'ActiveX component ...
-
ダブルコートのエスケープ
-
ISLispのsetq関数について教え...
-
typedef による2重定義
-
43:syntax error at end of input
-
解説サイトに従ったfortran並列...
-
コンパイル時のエラー
おすすめ情報