2010-12-14 8 views
-1

だから奇妙です。 FORTRANは変数をパラメータとして送信した後に再初期化する必要がありますか?私は別のサブルーチンに同じ引数を送るときはいつも、セグメンテーション違反を得ていました。私は引数の値が最初の呼び出しと2番目の呼び出しの間で消去されていることを発見しました。これらの引数の範囲は、メインプログラム(私は共通ブロックを使用していない)に限られています。FORTRANは関数呼び出しの間に値をワイプしますか?

私は自分の電話から書いているのですが、今はコードを投稿できませんが、アイデアはありますか?一時的な回避策は、2番目の関数を呼び出す前に値を再割り当てすることです。

ありがとうございました。

+0

コードはありません。 –

+0

私はStefanoに同意します。コードを見なければ何がうまくいかないのかどうかは分かりません。あなたは議論の目的を指定していますか? (あなたはすべきです)引数の範囲はメインプログラムに限られていますが、これらの変数をサブプログラムの引数として渡していると書いても、あなたは私を混乱させてしまいます。 -programスコープは拡張されていますが、別の名前を持つように見えるかもしれません。 –

+0

合意。スコープが拡張されます。それをサブルーチンでの参照と見落とされた値の変更と組み合わせると、segfaultのレシピがあります。 –

答えて

4

Fortranは参照で引数を渡すので、最初のサブルーチンでそれらを変更する場合は、呼び出し元で変更されます。

+0

私はサブルーチンでそれらを修正しているとは思わなかったが、より詳細な検査で私がそうであることが分かった。助けてくれてありがとう。 –

+0

できれば、関数内の変数宣言の一部として 'intent(in)'を指定すると、間違って何かに割り当てるべきではないかどうかをコンパイラがチェックできます。 –

3

いいえFortranは、サブルーチンコールで引数として使用されたときに変数をザッピングしません。

ただし、参照渡しの引数の値は、呼び出されたサブルーチンによって変更される可能性があります。

2回目の呼び出しの前に変数を印刷してください。最初のサブルーチンがどのようにパラメータを使用するかを見てください。

ちょうど私の¤0.02の価値 - 私はFortran(IV)を見てから数十年です。

+0

なぜか分かりませんが、「Fortran Four」を読むたびに「ナンバーナイン」(ピンクフロイド)を覚えています。 BTW私はまだパンチカードからFIVプログラムを読み込むことを覚えています。 –

+0

私はまだIBM 80列のカードをFortran IVのどこかに置いています(bookwormがそれらをゴミに減らさなかった場合) - Monty Python Yorkshiremanスケッチを引用します。 – RedGrittyBrick

+0

確かに、@lijieも同様に指摘されています。私は彼らが実際に変更されていることを忘れていました。あなたの努力のおかげですべて! –

関連する問題