- 締切済み
fortran
Warning: Variable VAL_AI is used before its value has been defined の警告がでています。 『以前それの値で使われた変数val_aiは定義された』 といった感じの意味だと解釈しています(英文のまんまです)。 サブルーチンでval_aiを定義して、とあるルーチンでval_aiを定義したルーチンをcallしています。 なぜ、このようなエラーになったのか、イマイチ理解できていません。 上記の警告だけ見て『これちゃうか!?』とか『これだろ!!』などわかる方、教えて下さい。 よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- ultraCS
- ベストアンサー率44% (3956/8947)
ソースを見ないと断言できませんが FORTRANのオリジナルな言語仕様では、サブルーチンでの値の変更は保存されません。戻り値に使って呼び出し側に戻すか、SAVE文で保存を宣言しなくてはなりません。 val_alをサブルーチンでどう定義しているかで副作用は変わります。 典型的な例として real val_al / 0. / のように初期設定として定義し、呼び出す度にカウンタのようにインクリメントする場合。 val_al=val_al+1. 古いFORTRANでは、サブルーチンはメモリに常駐せず、呼び出される度にディスクからモジュールをロードし直します。そのため、呼び出す度に、毎回、val_alは0.にリセットされてしまいます。ですから、何度呼んでも、val_alは1.になってしまい、カウンタとしては使えません。 それを防止するためにはval_alをSAVE文で宣言して保存しなくてはなりません。保存しておけばカウンタのように使えます。 これが、最近(といってもIBMなら1970年代以降、VAX、GCOS/ACOSなどなら当初から)のFORTRANの場合、サブルーチンはメモリに常駐するので、val_alをカウンタとして使っても問題は生じません(SAVE文不要)。まあ、現実としては、現代のFORTRANはすべてこちらです。 こういった問題があるので、サブルーチンにおいて静的初期化をしている場合には今でもWarningが出るようになっています(コンバイルオプションで消せるはず)。 このあたりを意識した警告ではないでしょうか
- sakusaker7
- ベストアンサー率62% (800/1280)
>『以前それの値で使われた変数val_aiは定義された』 >といった感じの意味だと解釈しています(英文のまんまです)。 初期化、もしくはなにか代入をする前にその変数の値を読み取った (取ろうとした)ということでしょう。 >サブルーチンでval_aiを定義して、とあるルーチンでval_aiを定義したルーチンをcallしています。 複数のサブルーチンで共有している変数なら宣言の仕方が悪いとか。
- osamuy
- ベストアンサー率42% (1231/2878)
> Variable VAL_AI is used before its value has been defined 「変数VAL_AIを定義する前に使用している」と言われているから、変数の生存期間やスコープを勘違いしているのでは。 変数宣言の部分を見直してみては。
- rinkun
- ベストアンサー率44% (706/1571)
> Warning: Variable VAL_AI is used before its value has been defined 直訳すると「警告:変数VAL_AIは値を定義する前に利用しています」でしょうか。 意味は明らかですね。
補足
今朝、プログラムを走らせたら、問題なく動きました。 謎です・・ でも、親切に回答いただき有難うございます。