Fortran中的可分配字符变量

11

我的代码(为了这个问题,我认为以下是相关的部分)是:

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

使用英特尔的Fortran编译器可以很好地工作,但是gfortran会给我带来一些错误,第一个错误出现在这一行:

CHARACTER(len=:), allocatable :: input_trim

我不确定哪个编译器符合Fortran标准。此外,我不知道如何以其他方式实现我所需的内容?!我认为我正在做的更多是一种变通方法。我需要一个包含确切输入文件名且没有后续空格的字符变量。

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

编辑2:关于allocate,你是对的:使用ifort时,我不需要它。而gfortran在此之前就已经崩溃了,所以也许它也不需要allocate,但我现在无法测试...

2个回答

20

这个

character (len=:), allocatable :: input_trim

在Fortran 2003中,“is certainly syntactically correct”是语法上正确的。由于您没有提及gfortran报错的具体内容,因此我无法评论为什么它不接受该行代码——也许您安装了旧版本的编译器。

使用最新的Fortran编译器(例如Intel Fortran v14.xxx),在对字符变量赋值之前无需分配其大小,您可以直接编写代码。

input_trim = trim(input)

请注意

read(*,*) input_trim

不能工作。


我认为这是gfortran版本的问题!当我提出这个问题时,我在办公室里,无法更新gfortran。回到家里,使用“GNU Fortran(Ubuntu/Linaro 4.8.1-10ubuntu9)4.8.1”,代码可以正常工作! - fpnick
哇,这实际上起作用了。似乎Fortran通过动态(可分配)字符串的无缝集成进入了21世纪。 - John Alexiou

0

使用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))

那段代码片段可能会编译(我不知道为什么不会),但我不清楚这与问题的相关性。问题是关于延迟长度字符变量的,而这个答案并不是。你能进一步解释一下吗? - francescalus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接