![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
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で質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) FORTRAN77の配列(除算) 2 2023/02/01 14:34
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
- 楽器・演奏 inEの楽譜を、トランペットE♭管で吹くにはどうすればいいのでしょうか? 3 2023/02/19 21:40
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Visual Basic(VBA) 【追加】ファイルを閉じてダイアログで保存した時だけ処理の実行をする 3 2022/03/23 15:43
- Visual Basic(VBA) 標準モジュール Public mOnTime As Date Sub sample() '実行プロシ 1 2023/02/22 15:44
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- Visual Basic(VBA) VBAで質問ですが、皆さんはどの様に導き出しているのでしょうか? 6 2022/05/03 21:53
- Excel(エクセル) エクセルで同じ数字同士を自動で線で結ぶVBAを教えてください 6 2022/04/26 23:13
- Visual Basic(VBA) このマクロの説明文を教えてほしいです。 1 2023/01/12 09:17
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
End Sub が必要です。
-
C言語のプログラムが実行できま...
-
Excel VABについて 下記記述が...
-
フォートランのエラーについて...
-
intel fortranのエラーで困って...
-
フォートラン(fortran)のエラー...
-
VBでエラー'ActiveX component ...
-
アセンブリ言語のメモリへの即...
-
pythonの条件分岐(if)
-
構造体のポインタ参照
-
他クラスからForm1内コントロル...
-
VBS WrteLineで1行ずつ出力する...
-
HEW3とBorlandC++でクラス定義...
-
ISLispのsetq関数について教え...
-
値を返さないといけないのに、...
-
Excel・Word リサーチ機能を無...
-
特定のPCだけ動作しないVBAマク...
-
配列数式の解除
-
エクセルで特定の列が0表示の場...
-
教えて下さい
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
End Sub が必要です。
-
intel fortranのエラーで困って...
-
フォートランのエラーについて...
-
他クラスからForm1内コントロル...
-
Excel VABについて 下記記述が...
-
対応する関数ヘッダーがありません
-
C言語のプログラムが実行できま...
-
AccessVBAでVLookupを使いたい
-
構造体のポインタ参照
-
フォートラン(fortran)のエラー...
-
43:syntax error at end of input
-
pythonの条件分岐(if)
-
#ifndefとかヘッダファイルにつ...
-
Excel VBA: UserForm.Show で実...
-
DLL内からの外部変数の参照
-
フォートランでの記述に関して
-
VBS WrteLineで1行ずつ出力する...
-
python numpy.linalg.inv()での...
-
VB2005でOCXを動的に呼び出すに...
-
VBでエラー'ActiveX component ...
おすすめ情報