【发布时间】:2017-10-01 09:04:19
【问题描述】:
为了对名单使用准动态字符串,我编写了以下代码
program main
implicit none
integer::inputlen
character(len=:),ALLOCATABLE::input
namelist /ttdata/ input,inputlen
ALLOCATE(character(len=10) :: input)
input(:)=' '
print *,'1.input="',input,'"'
open ( unit=10,STATUS='OLD',file='input.namelist')
read(10,nml=ttdata)
print *,'2.input="',input,'"'
if(inputlen.gt.10) then
close(10)
deallocate(input)
allocate(character(len=inputlen) :: input)
input(:)=' '
print *,'3.input="',input,'"'
open ( unit=10,STATUS='OLD',file='input.namelist')
endif
read(10,nml=ttdata)
print *,'4.input="',input,'"'
close(10)
end
input.namelist
&ttdata
inputlen=20,
input='123456789012345'/
输出
1.input=" "
2.input="1234567890"
3.input=" "
4.input="1234567890 "
我扩展了输出
...
4.input="123456789012345 "
似乎内存是按精确的方式分配的,但读入名单是错误的。 使用 pgfortran ce。 我做错了什么?或者我可以为程序的正确方式行为做些什么?
原来它一直是 x86-64 Linux -tp core2 上的 pgfortran 17.4-0 64 位目标。 gfortran 工作得很好。
来自 pgroup:
我已经用最新的 17.9 成功复制了你的行为 释放。我们已分配问题 TPR 24817。
【问题讨论】:
-
我做错了什么?您没有将
implicit none写为程序的第一行(在以program开头的行和任何use语句之后,但从您所展示的内容来看,您可能无论如何都没有这些行)。您没有将implicit none写为程序的第一行。您没有将implicit none写为程序的第一行。你没有写implicit none作为你程序的第一行。 -
为了强化前面的评论,我怀疑示例输出是示例程序的结果:
print *,'3.inputp="',inputp,'"'在程序中,但输出看起来像3.input=" "。请按原样显示程序,并创建一个minimal reproducible example。 -
列出了示例的完整代码。隐式 none 什么都不做。
-
implicit none 什么都不做。 它肯定会,它可以防止使用以前没有声明过的变量,并且使您能够修改代码以消除拼写错误。在这个阶段,您需要非常清楚地描述您仍然面临的问题。对我来说,(修改后的)代码和输入文件可以按预期工作。
-
您使用哪个编译器、哪个版本和哪个标志?我们必须测试您的确切代码和您的确切输入文件。
标签: string dynamic file-io fortran