旧代码是这样的:
PROGRAM FileName
USE ISO_C_BINDING, ONLY : C_Int32_t
IMPLICIT NONE
CHARACTER(LEN=120) :: FileName = âabc.txtâ
CHARACTER(LEN=120) :: Prefix = â/data/data_a/â
INTEGER(KIND=C_Int32_t) :: Len_FileName, Len_PreFix
Len_FileName = LEN_TRIM(FileName)
Len_PReFix = LEN_TRIM(Prefix)
FileName = Prefix(1:Len_PReFix) // FileName(1:Len_FileName)
Len_FileName = LEN_TRIM(FileName)
WRITE(*,*) âFileName(1:â, Len_FileName,â)=ââ, FileName(1:Len_FileName),âââ
END PROGRAM FileName
在Linux服务器上使用ifort13、ifort17和ifort19,它们都返回:
文件名(20)=/data/data_a/abc。txt
但是,运行OneAPI并安装最新英特尔2022的同一台Linux服务器提供:
文件名(12)=–of/data/data_a/data/da
我本以为右手宽会先被计算,然后被推到=符号的左手边。
我已经用write和format语句以及上面的内容尝试过了。
这好像是个编译器错误?
在更大的代码中,它实际上是一个子程序,有一个子程序根据环境变量搜索目录,但在上面的示例中缩短了这个子程序,以隔离和传递目录。
问题是:
这是一个编译器错误,还是Fortran规范中的行为发生了变化?
还是旧的英特尔不符合规范,但它只是工作?