代码之家  ›  专栏  ›  技术社区  ›  Holmz

使用ifort 2020和OneAPI更改字符串行为?

  •  -1
  • Holmz  · 技术社区  · 2 年前

    旧代码是这样的:

    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规范中的行为发生了变化? 还是旧的英特尔不符合规范,但它只是工作?

    0 回复  |  直到 2 年前