2017-05-28 76 views
2

我正在學習正確使用子程序,函數和模塊,下面是一個簡單的例子,編譯時沒有發生錯誤,執行後,結果是4.57187637E-41而不是pi,我查了幾個引用,還沒有發現錯誤。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

怎麼啦?預期的結果是什麼?請閱讀[問]。 –

回答

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

是的。有一個完整的開關 - 檢查未初始化或類似的東西。一旦調試完成,我擁有所有make文件並且不使用檢查和警告。 - 檢查界限或 - 檢查所有和-warn界面也很有用。 – Holmz