![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?8acaa2e)
他人が作った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で質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) FORTRAN77の配列(除算) 2 2023/02/01 14:34
- その他(コンピューター・テクノロジー) 量子コンピュータの動作原理がわかりません。同じビットが、1でも0でも有って良いだろうか? 3 2023/02/04 03:20
- Perl perlの構文でカンマの意味が分からない 2 2022/10/30 01:53
- C言語・C++・C# C言語 3 2022/10/04 15:07
- Visual Basic(VBA) vba 等間隔の列に対しての計算 6 2022/05/17 20:15
- その他(自然科学) 科学技術計算の仕事について 2 2023/02/04 18:09
- その他(ソフトウェア) F-BASICで計算中の実行が中途で勝手に止まり、大変困っています。 2 2023/03/02 16:15
- Perl perlで2次元配列をサブルーチンに値渡しで渡す 5 2022/12/17 18:49
- Windows 10 数年前からWindows10 の Update ができないです。なぜですか? 7 2022/11/09 06:03
- Visual Basic(VBA) エクセルのマクロについて教えてください。 7 2023/07/04 09:18
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
例外処理のフローチャートの記...
-
オフコン(富士通Kシリーズ)...
-
Excel VBAで、ユーザーフォー...
-
Fortranのサブルーチン引数につ...
-
プログラムの「生産性」について
-
ExcelVBA AddinでOnAction
-
モジュールとサブルーチン
-
PerlEditorのようなエディタ
-
Attempt to free unreferenced ...
-
KENT-WEBのWEBPATIOというCGIを...
-
ユーザー定義関数に#NAME?が返...
-
モジュールとクラスの違いって...
-
「デバイスは PRN を初期化でき...
-
エクセルVBAでシートモジュール...
-
現在アクティブなフォーム名を...
-
VBAでoutlook365が起動しません。
-
VBSがコンパイルエラーになりま...
-
VBAで旧字体を異字体に一括で変...
-
VBAのバージョン管理
-
モジュールとは何ですか
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
例外処理のフローチャートの記...
-
Excel VBAで、ユーザーフォー...
-
”:”がいっぱいの文について。
-
モジュールとサブルーチン
-
オフコン(富士通Kシリーズ)...
-
ExcelVBA AddinでOnAction
-
ACCESSのVBAでPrivate Sub ~en...
-
Attempt to free unreferenced ...
-
VBAで2重のDoLoop関数から抜け...
-
COBOLで、Shellを起動するには?
-
GOSUB命令とは
-
サブルーチンを認識しません。
-
同じコンボボックス、リストボ...
-
配列と互換性のない型の要素に...
-
Perlのスレッド?
-
サブルーチンを外部ファイルで...
-
サブルーチンの中にサブルーチ...
-
初心者です。Perlではどんな時...
-
プログラミング Fortran
-
サブルーチンを使った再帰的な...
おすすめ情報