用Fortran语言有时间吗?

用Fortran语言有时间吗?,fortran,pure-function,Fortran,Pure Function,我正在寻找一个纯粹的方式来获得时间信息。我考虑了标准编译器的内在函数和子程序(date\u和\u time,cpu\u time,system\u clock,ltime,ctime,…),格式对我来说并不重要。我也考虑过MPI函数,但它和内在函数一样,都是不纯函数 下面是一个简单的例子: elemental subroutine add(message, text) ! function add IMPLICIT NONE character(len=:),allocatable,

我正在寻找一个纯粹的方式来获得时间信息。我考虑了标准编译器的内在函数和子程序(
date\u和\u time
cpu\u time
system\u 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信息,而cpu信息由于我不知道的原因可能是线程不安全的)


可能是一个子问题,有没有一个解决方案来强制编译器考虑<代码> DATEYA和

当然,有一些技巧可以让编译器相信子例程是纯的。一种是平躺在接口块中

但对编译器撒谎也会带来后果。它可以进行不安全的优化,结果将是未定义的(通常是正确的,但是…)


请注意,我不得不删除您的
消息
,因为这与
元素

完全不兼容。关于纯粹获取时间的方式,答案是。返回当前时间或日期的函数是不纯的,因为在不同的时间,它引用某个全局状态时会产生不同的结果

当然,有一些技巧可以让编译器相信子例程是纯的。一种是平躺在接口块中

但对编译器撒谎也会带来后果。它可以进行不安全的优化,结果将是未定义的(通常是正确的,但是…)


注意,我不得不删除你的
消息
,因为这与
元素

完全不兼容。对于那些确实需要访问非纯本质的人,你对
不纯元素
满意吗?@francescalus你是对的
ltime
ctime
都不是Fortran标准的本质,MPI也不是功能。但如果它能起作用,我会接受它作为解决方案。我想为这个例子保留一个
纯元素的
子例程。否则,
inpure elemental
是编译示例的选项,但不是回答问题。Wikipedia()声明返回当前时间的函数是inpure。我同意维基百科。但是,你不必这么做。在强制编译器考虑一个非纯/不纯正过程时,请考虑我在不同的上下文中提到的问题。请不要考虑太多……高性能,好吧,谢谢你,我知道主要问题的答案是否定的,因为在不同的时间,它会产生不同的结果。不管怎样,也许我的子问题现在听起来更合理了。对于那些确实需要访问非纯内在函数的人,你对
不纯元素
满意吗?@francescalus你是对的
ltime
ctime
都不是Fortran标准内在函数,也不是MPI函数。但如果它能起作用,我会接受它作为解决方案。我想为这个例子保留一个
纯元素的
子例程。否则,
inpure elemental
是编译示例的选项,但不是回答问题。Wikipedia()声明返回当前时间的函数是inpure。我同意维基百科。但是,你不必这么做。在强制编译器考虑一个非纯/不纯正过程时,请考虑我在不同的上下文中提到的问题。请不要考虑太多……高性能,好吧,谢谢你,我知道主要问题的答案是否定的,因为在不同的时间,它会产生不同的结果。无论如何,也许我的子问题现在听起来更合理了。当我试图编译您的解决方案时遇到了一些问题,我得到了错误:当我试图生成可执行文件时,未定义对«我的日期和时间»的引用。甚至当我将子程序名“my_date_time”更改为“my_date_And_time”时也是如此。我遗漏了什么?为了精确我之前的评论:当我使用前面的模块add-only调用add子例程创建测试程序时,我将您的解决方案放在模块的contains部分。这样做,我得到了错误。也许我应该编辑我的问题,让这个尝试出现?好吧,你不能把
我的日期和时间
放在一个模块中。你不能对模块中的函数撒谎。这是一个外在的功能,我觉得自己完全是哑巴。我将子程序
my_date\u和_time
放在模块和程序之外,但仍然存在相同的错误。您能否在回答中给出一个使用
模块
程序
的工作示例?我在尝试编译您的解决方案时遇到了一些问题,我得到了错误:当我尝试生成可执行文件时,未定义对«我的日期»和»时间»的引用。甚至当我将子程序名“my_date_time”更改为“my_date_And_time”时也是如此。我遗漏了什么?为了精确我之前的评论:当我使用前面的模块add-only调用add子例程创建测试程序时,我将您的解决方案放在模块的contains部分。这样做,我得到了错误。也许我应该编辑我的问题,让这个尝试出现?好吧,你不能把
我的日期和时间
放在一个模块中。你不能对模块中的函数撒谎。这是一个外在的功能,我觉得自己完全是哑巴。我将子程序
my_date\u和_time
放在模块和程序之外,但仍然存在相同的错误。您能给出一个使用
模块
pr的工作示例吗
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