2017-05-28 26 views
2

私はサブルーチン、関数、モジュールの正しい使い方を学んでいます。以下は簡単な例です。コンパイル中にエラーは発生せず、結果はpiではなく4.57187637E-41です。参照、まだ間違いを発見していない。fortranのサブルーチンと関数を含むモジュール

module wz 
    implicit none 
    private 
    public :: print_out 
    real,parameter :: pi = 3.14159 
    contains 
     subroutine print_out 
     implicit none 
     real :: area 
     print *, area 
     end subroutine print_out 

     function f(x) result(area) 
     implicit none 

     real, intent(in):: x 
     real   :: area 

     area = pi * x ** 2 
     end function f 
end module wz 

program test_module 
use wz 
implicit none 
    real :: x 
    x = 1. 
    call print_out 
end program test_module 
+0

どのように間違っていますか?期待される結果は何ですか? [ask]をお読みください。 –

答えて

2

宣言の直後と何かをする前に、印刷する値はareaです。あなたはxfに関数を渡す必要がある、とあなたはprint_outサブルーチンを経​​由していることを行うことができます。

module wz 
    implicit none 
    private 
    public :: print_out 
    real,parameter :: pi = 3.14159 
    contains 
     subroutine print_out(x) 
     implicit none 
     real, intent(in) :: x 
     real :: area 
     area = f(x) 
     print *, area 
     end subroutine print_out 

     function f(x) result(area) 
     implicit none 

     real, intent(in):: x 
     real   :: area 

     area = pi * x ** 2 
     end function f 
end module wz 

program test_module 
use wz 
implicit none 
    real :: x 
    x = 1. 
    call print_out(x) 
end program test_module 
+0

ありがとうございます。この種の間違いを避けるために、変数にいくつかの属性を追加できるような方法はありますか?その場合、コンパイラは特定の間違いを促します。 – ComplicatedPhenomenon

+0

宣言された変数のみを印刷したのは間違いですか?私はそうは思わない。変数が宣言されると、その変数にいくつかのメモリが割り当てられ、 "ガベージ"値が割り当てられます(通常は0に非常に近い)。 –

+0

はい。 uninitやそのようなものをチェックするための完了スイッチがあります。私はすべてのファイルを作成し、デバッグが完了したらチェックと警告を使用しません。 -Check boundsまたは-check allおよび-warn interfacesも便利です。 – Holmz

関連する問題