【问题标题】:Allocatable character variables in FortranFortran 中可分配的字符变量
【发布时间】:2014-01-03 16:18:49
【问题描述】:

我的代码(精简到我认为与这个问题相关的内容)是

PROGRAM test

IMPLICIT NONE

CHARACTER(len=37) input
CHARACTER(len=:), allocatable :: input_trim


WRITE(*,*) 'Filename?'
READ(*,*) input
ALLOCATE(character(len=LEN(TRIM(input))) :: input_trim)
input_trim=trim(input)

.
.
.

END PROGRAM test

它在 Intel 的 Fortran 编译器上运行良好,但是 gfortran 给了我几个错误,第一个错误是在行中说

CHARACTER(len=:), allocatable :: input_trim

对于 Fortran 标准,我不确定哪个编译器是“正确的”。另外我不知道如何以不同的方式实现我需要的东西?!我认为无论如何我正在做的更多的是一种解决方法。我需要的是一个字符变量,其中包含输入的文件名,后面没有空格。

编辑:错误是“字符声明中的语法错误”。 gfortran --version 给我“GNU Fortran (GCC) 4.4.7 20120313 (Red Hat 4.4.7-3)”

编辑 2:关于分配,您是对的:使用 ifort,我不需要它。并且 gfortran 在此之前崩溃了,所以也许它也不需要分配,但我目前无法测试这个......

【问题讨论】:

    标签: fortran character trim


    【解决方案1】:

    这个

    character (len=:), allocatable :: input_trim
    

    在 Fortran 2003 中肯定在语法上是正确的。你没有说 gfortran 引发的错误是什么,所以我无法评论它为什么不接受该行——也许你有一个旧版本安装的编译器。

    使用最新的 Fortran 编译器(例如 Intel Fortran v14.xxx),您无需在分配字符变量之前分配它的大小,您可以简单地编写 p>

    input_trim = trim(input)
    

    注意

    read(*,*) input_trim
    

    不会工作。

    【讨论】:

    • 我认为是gfortran版本!当我问这个问题时,我在无法更新 gfortran 的办公室里。在家里,使用“GNU Fortran (Ubuntu/Linaro 4.8.1-10ubuntu9) 4.8.1”,代码运行良好!
    • 哇,这确实有效。似乎 fortran 刚刚进入 21 世纪,无缝集成了动态(可分配)字符串。
    【解决方案2】:

    使用 Absoft Fortran,可以编译(尚未使用它运行):

    character,dimension(:),allocatable::Line_for_IO !Metcalf,Reid,Cohen p. 107, w/mods
    if(allocated(Line_for_IO)) deallocate(Line_for_IO)
    allocate(Line_for_IO(7*n+40))
    

    【讨论】:

    • 该代码片段可能会编译(我不明白为什么不应该编译),但我不清楚为什么这与问题相关。问题是关于延迟长度字符变量,而这个答案不是。你能进一步解释一下吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-27
    • 2019-02-08
    • 2012-05-04
    • 1970-01-01
    • 2020-01-23
    相关资源
    最近更新 更多