2012-10-04 61 views
3

此問題與問題連接:如何檢測子程序內部intent(in)的違規情況。但我還沒有在相關問題Enforce intent(in) declared variables in Fortran as constant also in called subroutines/functions中找到答案。如何強制編譯器將意圖解釋爲intent(inout)

聲明爲intent(in)的變量可以被另一個子程序/函數修改,但省略了意圖聲明。

例如:

module test 
    implicit none 
    contains 

    subroutine fun1(x) 
    real(8), intent(in)::x 
    call fun2(x) 
    end subroutine 

    subroutine fun2(x) 
    real(8) :: x 
    x = 10 
    end subroutine 
end module 

此代碼可以在不通過gfortran和ifort任何錯誤/警告進行編譯。所以我的問題是:

  1. 是否有可能禁止省略意圖聲明?
  2. 是否可以強制Fortran編譯器將省略的意圖解釋爲intent(inout)

回答

3

兩個答案都是NO。未指定的意圖與所有其他意圖是根本不同的。它與intent(inout)不同,因爲您可以將不可定義的表達式傳遞給具有未指定意圖的子例程。

此外,在許多情況下不允許指定的所有意圖(在Fortran 95的過程參數,指針,...)

如果你想要求指定意向的,你可以定義你的子程序爲pure但它遠不止於此。但這對你來說可能是正確的。它禁止任何副作用。

+0

因此,這意味着沒有辦法確定intent(in)不會違反「純粹」子例程嗎?感謝「純粹」提示的方式。 – Sergey

+0

不幸的是,調用過程不能查看其他過程。它甚至可以看到它的界面,例如已經聲明的意圖。 –

-2

我認爲你應該得到一個編譯錯誤,由於自動定義的接口。例如(我將fun2虛擬參數x切換到z,我認爲更清楚地表明瞭我的觀點),我會期待同樣的錯誤維度。

module test 
    implicit none 
    contains 

    subroutine fun1(x) 
    real(8), intent(in)::x 
    call fun2(x) 
    end subroutine 

    subroutine fun2(z) 
    real(3) :: z 
    z = 10 
    end subroutine 
end module 
+0

這個答案毫無意義。沒有「自動定義的界面」;改變虛擬參數的名稱完全沒有影響;它似乎混淆了同類的觀點與維度。 – francescalus