他人が作ったFortran(恐らくFortran77)のプログラムで計算をしようとしています。
コンパイルはできるのですが,実行するとエラーが出てしまい困っています。
エラーメッセージは
「forrtl:severe(157):Program Exception - access violation」
となっていて,実行時エラー番号で調べると
「プログラムが適切な参照権を持っていない仮想アドレスに書き込み,または読み取り
を行おうとした」と出ていました。
Fortran初心者の自分にはイマイチ意味が判らないのですが,エラーが出た後に
サブルーチンのある決まった場所に黄色い矢印が示されます。
そこで今,その部分のサブルーチンを確認しているところです。
前置きが長くなってしまいましたが
サブルーチンの中を確認している途中で疑問に思った所が一つあります。
問題のサブルーチンは
---------------------------------------
call dbesl(EN,0,BX0,BY0,BI0,BK0)
subroutine dbesl(X,NOR,BX,BY,BI,BK)
FN = NOR
・
・
・
11 NOR = FN <---この行に黄色い矢印が出る
return
end
---------------------------------------
となっているのですが,サブルーチンを呼び出すcall文の所で
2つ目の引数が『0』となっているのは正しい使い方なのでしょうか?
どうもサブルーチン内の計算をしてメインプログラムに引数を返す所が
おかしいような気がしています。
因みにメインプログラムに戻る際の"FN"の値は『0』となっていました。
コンパイラはCompaq Visual Fortranを使用しています。
足りない情報は出来るだけ追記していきますので,ご教示宜しくお願いします。
A 回答 (2件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
FORTRANはCのように値呼び出し(Call by Value)ではなく、すべての変数はアドレス呼び出し(Call by Reference)になります。
ですから、このサブルーチン呼び出しでは、0の格納されている番地をサブルーチンに渡し、その番地にデータFNを格納して返していることになります。これが行われると、プログラムの他のところで使われている定数としての0がすべて置き換わってしまいますから、通常、こういった使い方は許されないようになっています。コンパイラは、ここでの0など、定数として定義された値は、リテラルプールという特別な場所に格納します。x86系のコンパイラだと、DS(データセグメント)ではなく、CS(コードセグメント)に配置する場合もあるかもしれません。
実際には、メモリー上では、0という値をもった変数でしかありません。ただ、プログラムの他の場所で0が使われる場合にもこのリテラルプールの0を参照するようになっています。ですから、この0の所にカキコみれてしまうと、プログラム中で0を引用しているところがすべておかしくなってしまうのです。
昔のFORTRANには、このあたりの保護がいい加減で、リテラルが書き換わってもそのまま実行してしまうものもありましたが、最近はちゃんと管理していると思います。
まあ、単純には0を変数にしてそこに0を代入して呼び出せば(名前からするとBessel関数かな)いいとは思いますが、元々がデータ型に無頓着なコーディングしているようだし、他にもエラーがありそうだなあ。
No.1
- 回答日時:
>2つ目の引数が『0』となっているのは正しい使い方なのでしょうか?
細かい理由の説明は省きますが、十中八九それが原因でしょう。
コンパイラによってはこれを許すものもあるかもしれませんが、
たぶん「場合によっては使えるものもある」程度であって
「どのコンパイラでも使える」というものではないと思います。
とりあえず、適当な変数を呼び出し元に追加して、それに0を入れた上で
subroutine dbesl(X,NOR,BX,BY,BI,BK) を呼び出してはどうでしょうか。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
例外処理のフローチャートの記...
-
ExcelVBA AddinでOnAction
-
ACCESSのVBAでPrivate Sub ~en...
-
COBOLで、Shellを起動するには?
-
初心者です。Perlではどんな時...
-
オフコン(富士通Kシリーズ)...
-
モジュールとサブルーチン
-
Excel VBAで、ユーザーフォー...
-
エクセルVBAでシートモジュール...
-
Excel VBAで、ユーザーフォーム...
-
VBAで別モジュールへの変数の受...
-
グラフのX,Y座標を取得したい
-
Cからシェルを起動し返り値をハ...
-
VBAで旧字体を異字体に一括で変...
-
acwzlibとは?
-
Perl モジュールのアンインスト...
-
ユーザー定義関数に#NAME?が返...
-
YAMLについて
-
VBSがコンパイルエラーになりま...
-
VBA ユーザーフォーム Image1 ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
例外処理のフローチャートの記...
-
Excel VBAで、ユーザーフォー...
-
モジュールとサブルーチン
-
オフコン(富士通Kシリーズ)...
-
COBOLで、Shellを起動するには?
-
ExcelVBA AddinでOnAction
-
VBAで2重のDoLoop関数から抜け...
-
”:”がいっぱいの文について。
-
ブラウザを閉じた時にサブルー...
-
ACCESSのVBAでPrivate Sub ~en...
-
サブルーチンを認識しません。
-
CASLIIの問題
-
配列と互換性のない型の要素に...
-
Attempt to free unreferenced ...
-
fortran95実行エラー
-
サブルーチンの中にサブルーチ...
-
exit aaaa();
-
perlの構文でカンマの意味が分...
-
初心者です。Perlではどんな時...
-
C#でJavaAPIを使用方法
おすすめ情報