我希望将Fortran中的write-statement包装在一个自定义子程序或函数中,其中包括一些额外的调试逻辑。
但我目前卡在定义函数/子程序的原型上。这是可能的吗?如果是,如何做到?
我希望将Fortran中的write-statement包装在一个自定义子程序或函数中,其中包括一些额外的调试逻辑。
但我目前卡在定义函数/子程序的原型上。这是可能的吗?如果是,如何做到?
您的问题标题存在一些误解,但是从文本中可以看出您对此有所了解。不过,为了记录,write
是一条Fortran语句,既不是子例程也不是函数。
我认为您有几个选项。其中一个是我偶尔使用的,那就是编写一个返回字符串的函数。或许:
function error_message(error)
character(len=*), intent(in) :: error
character(len=:), allocatable :: error_message
error_message = 'ERROR: '//trim(error)
end function error_message
您可以像这样使用它
write(*,*) error_message('Oh s**t')
integer, parameter :: debug_channel = 99
logical, parameter :: debugging = .false.
...
if (debugging) then
open(debug_channel, file='NUL')
else
open(debug_channel, file='debuglog'
end if
write(debug_channel,*) 'message'
要实现您想要的大部分内容,比较简单的方法是将if
直接放在每个受调试控制的写入语句前面:
if(debug)write(..,..)..
其中 debug 是一个全局逻辑值,或者甚至是:
if(debugf(level))write(..,..)..
其中逻辑函数 debugf 决定是否基于某些参数进行写入操作。
if (debug) write...
。module errormod
type error_t
character(len=:), allocatable :: message
contains
procedure write_error
generic :: write(formatted) => write_error
end type error_t
logical debug_verbose
contains
subroutine write_error(err, unit, iotype, v_list, iostat, iomsg)
class(error_t), intent(in) :: err
integer, intent(in) :: unit
character(len=*), intent(in) :: iotype
integer, intent(in), dimension(:) :: v_list
integer, intent(out) :: iostat
character(len=*), intent(inout) :: iomsg
if (debug_verbose) then
write(unit, '("Error: ", A)', iostat=iostat, iomsg=iomsg) err%message
else
write(unit, '()', advance='no')
end if
end subroutine write_error
end module errormod
program test
use errormod
implicit none
type(error_t) error
debug_verbose = .TRUE.
error%message = "This error will be reported."
write(*, '(dt)') error
debug_verbose = .FALSE.
error%message = "This error will not be reported."
write(*, '(dt)') error
debug_verbose = .TRUE.
error%message = "This final error will also be reported."
write(*, '(dt)') error
end program test