【发布时间】:2012-01-07 03:50:33
【问题描述】:
我正在尝试将错误检查合并到我正在编写的纯程序中。我想要类似的东西:
pure real function func1(output_unit,a)
implicit none
integer :: a, output_unit
if (a < 0) then
write(output_unit,*) 'Error in function func1: argument must be a nonnegative integer. It is ', a
else
func1 = a/3
endif
return
end function func1
但是,纯函数不允许对外部文件有 IO 语句,所以我尝试将单元号传递给函数,例如output_unit = 6,这是默认输出。 gfortran 仍然认为这是非法的。有没有解决的办法?是否可以将函数设为派生类型(而不是此处的固有类型 real),在出现错误时输出字符串?
【问题讨论】:
-
从技术上讲,“纯”过程不会以任何方式修改其环境或任何操作数。
-
所以它不应该打印到屏幕上?它可以打印到主程序可以访问并打印到屏幕的内部字符串吗?不过,那是相当迂回的。
-
@SamuelTan - 不 - PURE 中没有任何类型的 I/O。简而言之,它不会改变任何东西(变量、本地或全局),它不会保存,也不会 I/O 任何东西(列出它所做的事情会更容易:\ ... ;)
-
绕过这些限制的常用方法是将函数转换为子例程并添加一个额外的参数来返回状态(您可以为此参数使用派生类型,以返回错误代码和错误文本)。
-
@HotLicks。我在
do concurrent块中使用这个函数,所以它必须是纯的(我必须明确地将pure放在前面,否则编译器会抱怨)。
标签: error-handling io fortran gfortran fortran95