2010-12-12 9 views
1

スカラーINTEGERを作成してサブルーチンに渡すと、その値が浮動小数点に変換されていて、ひどく不正確です。たとえば、s = 2に設定し、print_my_intを呼び出してコンソールに出力する場所()は、2.80259693E-45という値が表示されます。他のスカラー整数もs = 0の場合を除いて同様に振る舞います。この場合、出力は0.0000000です。しかし、これはまだ間違っています。なぜなら、整数は明らかに小数と仮数を表示してはならないからです。これは出力形式の問題ではありません。ローカルに表示されたときに他の整数が正しく表示されるようになるためです。Help! FORTRAN整数を渡すと、不正確な浮動小数点数に変換されますか?

ここで何が起こっているかについての手掛かりはありますか?引数のデータ型をサブルーチン定義に強制する必要がありますか?これもできますか?

コード例:

PROGRAM print_int 
    INTEGER s 
    s = 2 
    CALL print_my_int(s) 
END PROGRAM print_int 

SUBROUTINE print_my_int(x) 
    WRITE(*,*) x 
END SUBROUTINE print_my_int 

結果の出力:

2.80259693E-45 

答えて

1

さて、時期尚早のポストが、私は同じに動作します誰のためにそれを残しておきます。私はFORTRANでパラメータ型を強制する構文に慣れていません。サブルーチンの定義では、パラメータのデータ型は名前とパラメータのリストの下にあります。含まれていない場合、GNUコンパイラは警告もスコープもしません。私はそれがデフォルトで他のタイプにキャストしていると思います。だから、私の上記の例は...このよう

PROGRAM print_int 
    INTEGER s 
    s = 2 
    CALL print_my_int(s) 
END PROGRAM print_int 

SUBROUTINE print_my_int(x) 
    INTEGER x 
    WRITE(*,*) x 
END SUBROUTINE print_my_int 
+1

FORTRANに変数名の最初の文字に基づいた型推論があるので、パラメータ名を 'x'から' i'または 'j'に変更した場合もうまくいきます。しかし、それをしないでください---悪い習慣です。 – JasonFruit

+0

ありがとうございます。便利なヒントですが、医療過誤を避けるために気をつけています。 –

+3

宣言されていない変数に対してコンパイラチョークを作成したい場合は、すべてのプログラム/サブルーチンの先頭に "implicit none"ステートメントを使用することをお勧めします。 – steabert

2

ない新しい何かを読む必要があり、ちょうどコメントに適合していないいくつかのコードを提供することにより、インタフェースの使用を指摘したかった:

PROGRAM print_int 
INTERFACE 
    SUBROUTINE print_my_int(x) 
    END SUBROUTINE 
END INTERFACE 
INTEGER s 
s = 2 
CALL print_my_int(s) 
END PROGRAM print_int 

SUBROUTINE print_my_int(x) 
WRITE(*,*) x 
END SUBROUTINE print_my_int 
3

別の拡張コメント:あなたは宣言セクションの先頭にどこでもimplicit noneを置くことができ、あるいはあなたはサブルーチンを使用して、あなたのプログラムのインターフェイスを置くことができます述べたように、コンパイラは型の不一致エラーがスローされます@steabertよりも単純なプログラム内にサブルーチンを含めることで、コンパイラが明示的なインタフェースを作るように強制し、3行のコードを保存します。暗黙的にサブルーチン内のxの宣言を残すことによって、コンパイラはエラーを検出します。

関連する問題