Fortran拼接字符串整数生成可变格式报错:缺失格式左括号
Fortran可变格式字符串问题解答
我需要为Fortran的WRITE语句创建可变格式,编写了如下测试程序(nvari为变量):
program VariableFormat implicit none integer :: x = 1,y = 2, z = 3, i, nvari double precision :: pi = 3.14 integer, allocatable :: var(:) integer :: A(3) = (/1,2,3/) character(100) :: fmt,fmt2,str1,str2,str3 print*, size(A) allocate(var(size(A))) do i = 1, size(A) var(i) = A(i) end do nvari = 2 ! ! first part ! fmt = '(a,f4.2)' write(*,fmt) "The value of pi is ", pi ! ! second part ! write (str1, "(1A2,1I1,1A1,1I2,1A1)") "'(", 3, "I", 15, "," print*, str1 write(str2,'(I10)') nvari print*, str2 write (str3, "(1A1,1I2,1A2)") "I", 15, ")'" print*, str3 fmt2 = trim(adjustl(str1))//trim(adjustl(str2))//trim(adjustl(str3)) print*, fmt2 write(*,fmt2) x,y,z,(var(i),i=1,nvari) end program VariableFormat
问题一:运行时格式错误
运行第二部分时报错:
At line 32 of file VariableFormat.F90 (unit = 6, file = 'stdout') Fortran runtime error: Missing initial left parenthesis in format '(3I15,2I15)'
明明fmt2看起来和fmt格式类似,都是'(X,Y)'形式,为什么提示缺失左括号?
解答
问题出在fmt2包含了多余的单引号:
- 第一部分的
fmt = '(a,f4.2)'中,单引号是Fortran字符串的定界符,不是格式字符串的内容,实际fmt存储的内容是(a,f4.2),符合Fortran格式字符串的要求。 - 而你通过
str1/str2/str3拼接生成的fmt2,内容是'(3I15,2I15)'——把单引号也包含在了格式字符串里。Fortran解析格式时,第一个字符是单引号',而非预期的左括号(,因此报错“缺失左括号”。
解决方法:去掉拼接时加入的单引号,让fmt2的内容直接是(3I15,2I15),比如修改str1和str3的写入内容:
write (str1, "(1A1,1I1,1A1,1I2,1A1)") "(", 3, "I", 15, "," ! 去掉开头的单引号 write (str3, "(1A1,1I2,1A1)") "I", 15, ")" ! 去掉结尾的单引号
问题二:更简洁的生成fmt2的方式
解答
完全不需要拆分三个字符串拼接,直接用一次内部WRITE就能生成目标格式字符串,还能避免trim/adjustl的冗余操作:
! 用I0格式自动输出无空格的整数,无需额外处理 write(fmt2, '(A,I0,A,I0,A)') '(', 3, 'I15,', nvari, 'I15)'
如果要更灵活,比如用数组A的大小代替硬编码的3,可以写成:
write(fmt2, '(A,I0,A,I0,A)') '(', size(A), 'I15,', nvari, 'I15)'
一行代码即可生成正确的格式字符串,无需额外处理空格或拼接。
内容的提问来源于stack exchange,提问作者user790082
相关产品推荐
相关产品推荐

