我想将包含多个项目(因此多行)的名称列表写入字符变量。以下代码在使用 gfortran 编译时运行良好,但在使用 ifort 编译时返回写入错误:
program test
implicit none
type testtype
real*8 :: x
character(len=32) :: str
logical :: tf
end type testtype
type(testtype) :: thetype
integer :: iostat
character(len=1000) :: mystr(10)
namelist /THENAMELIST/ thetype
integer :: i
thetype%x = 1.0d0
thetype%str="This is a string."
thetype%tf = .true.
mystr=""
write(*,nml=THENAMELIST,delim="QUOTE")
write(mystr,THENAMELIST,iostat=iostat,delim="QUOTE")
write(*,*)"Iostat:",iostat
do i = 1, size(mystr)
write(*,*)i,trim(mystr(i))
end do
end program test
输出如下:
> ifort -o test test.f90 ; ./test
&THENAMELIST
THETYPE%X = 1.00000000000000 ,
THETYPE%STR = "This is a string. ",
THETYPE%TF = T
/
Iostat: 66
1 &THENAMELIST THETYPE%X= 1.00000000000000 ,
2
3
4
5
6
7
8
9
10
英特尔的运行时错误消息列表告诉我:“严重 (66):输出语句溢出记录”。
为了过于完整,我当然会使用 gfortran
> gfortran -o test test.f90 ; ./test
&THENAMELIST
THETYPE%X= 1.0000000000000000 ,
THETYPE%STR="This is a string. ",
THETYPE%TF=T,
/
Iostat: 0
1 &THENAMELIST
2 THETYPE%X= 1.0000000000000000 ,
3 THETYPE%STR="This is a string. ",
4 THETYPE%TF=T,
5 /
6
7
8
9
10
我在整个互联网上进行了搜索,并了解到内部文件不能是标量字符变量,但这与我发现的差不多。GFortran 确实接受一个标量变量,并且只是在该变量中写入换行符,但我猜那是非标准的 fortran。
我使用的编译器是:
- gfortran GNU Fortran (MacPorts gcc48 4.8-20130411_0) 4.8.1 20130411(预发布)
- ifort (IFORT) 12.0.5 20110719(在 mac 上)
- ifort (IFORT) 13.1.1 20130313(在 GNU/Linux 上)
我的问题是:我的语法有什么错误,或者我怎样才能将名单写入内部文件,而不必通过写入实际的外部暂存文件并将其读入我的变量来修补问题(这就是我现在做,但对于大型名单来说这很慢)?