有时间在福特兰纯粹吗?



我正在寻找一种纯粹的方式来访问时间信息。我想到了标准编译器的内在函数和子例程(date_and_timecpu_timesystem_clockltimectime、...),格式对我来说并不重要。我也想到了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完全不兼容。

相关内容

  • 没有找到相关文章

最新更新