2017-04-25 60 views
0

我正在尋找一種純粹的方式來訪問時間信息。我想到了標準編譯器的內在函數和子程序(date_and_time,cpu_time,system_clock,ltime,ctime,...),格式對我來說並不重要。我也想過MPI函數,但它與內在函數相同,都有不純的函數。在Fortran中有純粹的時間嗎?

下面是一個小例子:

elemental subroutine add(message, text) 
    ! function add 
    IMPLICIT NONE 
    character(len=:),allocatable,intent(inout) :: message 
    character(len=*), intent(in)     :: text 
    character(len=1), parameter     :: nl=char(10) 
    character(10) :: time 
    ! character(8) :: date 

    ! time= 'hhmmss.sss' 
    call DATE_AND_TIME(time) 
    Message= Message//time////text//nl 

end subroutine add 

,我得到一個邏輯錯誤:

Error: Subroutine call to intrinsic ‘date_and_time’ at (1) is not PURE 

因此,我遊蕩,如果有時間信息的途純是否存在,或者如果它純粹是不可能的(可能是因爲它必須使用cpu信息,由於我未知的原因,這可能是線程不安全的)。

也許,一個子問題可能有一個解決方案,迫使編譯器考慮純粹(或任何其他類型的函數)的date_and_time

+0

對於那些需要訪問非純內在函數的人來說,你是否滿意於「不純元素」? – francescalus

+0

@francescalus你是對的'ltime'和'ctime'不是Fortran標準內在函數,也不是MPI函數。但是,如果它能完成這項工作,我會接受它作爲解決方案。我想爲這個例子保留一個「純元素」子程序。否則'不純元素'是編譯示例的一個選項,但不能回答這個問題。 –

+3

維基百科(https://en.wikipedia.org/wiki/Pure_function)指出返回當前時間的函數是不純的。我同意維基百科。但你不必這樣做。 –

回答

3

關於純粹獲得時間的方式的答案是。返回當前時間或日期的函數是不純的,因爲在不同的時間會產生不同的結果 - 它指的是某種全局狀態。

說服編譯器一個子程序是純粹的有一定的技巧。一種是平躺在接口塊中。

但是,對編譯器說謊有後果。它可以進行不安全的優化,結果將是不確定的(無論如何,大多數情況下都是正確的,但是...)。

module m 
contains 

    elemental subroutine add(text) 
    IMPLICIT NONE 
    character(len=*), intent(in)     :: text 
    character(len=1), parameter     :: nl=char(10) 
    character(10) :: time 
      intrinsic date_and_time 

    interface 
     pure subroutine my_date_and_time(time) 
     character(10), intent(out) :: time 
     end subroutine 
    end interface 

    call MY_DATE_AND_TIME(time) 
    end subroutine add 

end module 

program test 
    use m 

    call add("test") 
end program 

subroutine my_date_and_time(time) 
    character(10), intent(out) :: time 

    call date_and_time(time) 

end subroutine 

通知我不得不刪除您message,因爲這是與elemental絕對不相容的。

+0

我嘗試編譯解決方案時遇到一些麻煩,當我嘗試生成可執行文件時,出現錯誤:未定義對「my_date_and_time_」的引用。甚至當我將子程序名稱「my_date_time」更改爲「my_date_and_time」時。我錯過了什麼? –

+0

爲了精確我以前的評論:我把你的解決方案放在模塊的包含部分,當我使用前一個模塊創建一個測試程序時,只添加調用add子程序。這樣做,我收到錯誤。也許我應該編輯我的問題,讓這個嘗試出現? –

+0

那麼,你不能把'my_date_and_time'放在模塊中。你不能說謊模塊中的功能。這是一個外部功能。 –