我正在寻找一种纯粹的方式来访问时间信息。我想到了标准编译器的内在函数和子例程(date_and_time
、cpu_time
、system_clock
、ltime
、ctime
、...),格式对我来说并不重要。我也想到了MPI函数,但它和内函数一样,都有不纯函数。
下面是一个最小示例:
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
纯粹的(或任何其他此类函数)?
关于纯粹的方式获得时间的答案是否定的。返回当前时间或日期的函数是不纯的,因为在不同的时间它会产生不同的结果——它指的是某种全局状态。
当然有一些技巧可以说服编译器子例程是纯的。一种是平躺在接口块中。
但是对编译器撒谎会带来后果。它可以进行不安全的优化,结果将是未定义的(无论如何通常是正确的,但是......
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
完全不兼容。