【发布时间】:2021-12-14 00:35:21
【问题描述】:
我正在处理的 Fortran 代码有几行类似于
WRITE(filename, '(A16,"_",I4,".dat")') filename, indx
此代码已在许多不同平台和几乎所有主要编译器上成功编译和运行数百次。但是突然间,最新的(或者,无论如何,新的)英特尔编译器不喜欢它了。它会发出警告消息"forrtl: .... Internal file write-to-self; undefined results"。此行执行后,合理的字符数组"filename"变为空白。
我想问题在于filename 既是写入的输入,也是内部写入的目的地。修复很容易。它可以将filename 替换为filename_tmp 之类的目标。但正如我所说,直到现在这才没有必要。
所以我想知道,文件名作为输入和目标是否违反了 Fortran 标准,但是所有这些编译器多年来一直对此视而不见,现在英特尔变得越来越严格了?还是英特尔“势利”?还是彻头彻尾的越野车?
【问题讨论】:
-
虽然这个输出语句是不允许的,但你可以使用赋值来做类似的事情:
filename=TRIM(filename)//'_'//int2str(indx)//'.dat(虽然丑)而不是使用临时副本。关键区别在于赋值语句在赋值之前会完全评估右侧。 -
最好添加接受/不接受的编译器版本,让其他想知道他们是否有同样问题的人更清楚。
-
这看起来根本不对。即使编译器可以接受,Fortran 也会在您运行时发出运行时错误(记录结束),因为您尝试写入
filename本身加上另外 9 个字符。此外,即使您将第二个filename替换为trim(filename),并且假设修剪后的filename仍然有9 个字符,gfortran 也会发出运行时错误。 francescalus 建议的字符串连接只是最优雅的解决方案。 -
@Pap,该 write 语句不写
filename加 9 个字符:它写 前 16 个字母(或更少)filename加上更多。如果character(len=25) filename则没有问题。 -
@francescalus 正确。但即使
len(filename)>=25这看起来不正确。当我阅读那个 write 语句时,我立刻想到“为什么不连接字符串呢?”。
标签: io fortran intel-fortran