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を探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
End Sub が必要です。
-
intel fortranのエラーで困って...
-
Excel VABについて 下記記述が...
-
コンパイルで未定義のシンボル
-
フォートランのエラーについて...
-
typedef による2重定義
-
VBでエラー'ActiveX component ...
-
AccessVBAでVLookupを使いたい
-
決まった時刻にコンパイルエラ...
-
教えて下さい
-
配列数式の解除
-
メッセージボックスのOKボタ...
-
特定のPCだけ動作しないVBAマク...
-
Excel マクロ VBA プロシー...
-
Excel・Word リサーチ機能を無...
-
UserForm1.Showでエラーになり...
-
VBAでfunctionを利用しようとし...
-
一つのTeratermのマクロで複数...
-
エクセルで特定の列が0表示の場...
-
ExcelのVBA。public変数の値が...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
End Sub が必要です。
-
フォートランのエラーについて...
-
Excel VABについて 下記記述が...
-
対応する関数ヘッダーがありません
-
C# IEnumerable が IEnumerable...
-
intel fortranのエラーで困って...
-
AccessVBAでVLookupを使いたい
-
typedef による2重定義
-
文字列で入力したプログラムか...
-
43:syntax error at end of input
-
構造体のポインタ参照
-
VB.NETのStructureの使い方を教...
-
DLL内からの外部変数の参照
-
解説サイトに従ったfortran並列...
-
Makefile と <math.h>
-
C言語のプログラムが実行できま...
-
フォートラン(fortran)のエラー...
-
他クラスからForm1内コントロル...
-
プロポからのパルス値解析ソー...
-
#ifndefとかヘッダファイルにつ...
おすすめ情報