Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Formatting 为依赖于变量的输出设置字符串格式_Formatting_Fortran_Fortran90_Intel Fortran - Fatal编程技术网

Formatting 为依赖于变量的输出设置字符串格式

Formatting 为依赖于变量的输出设置字符串格式,formatting,fortran,fortran90,intel-fortran,Formatting,Fortran,Fortran90,Intel Fortran,我想要一个Fortran write语句的格式取决于某个变量。例如,我可以写: write(*,'(3f15.3,3f9.2)') x,y,z,(var(i),i=1,nvari) 其中nvari=3。但是,如果在某些情况下,我实际上有4个变量(即,nvari=4)。我想这样写: write(*,'(3f15.3,nvari(f9.2))') x,y,z,(var(i),i=1,nvari) write(*,'(3f15.3,nvari(f9.2))') x, y, z, (var(i),

我想要一个Fortran write语句的格式取决于某个变量。例如,我可以写:

write(*,'(3f15.3,3f9.2)') x,y,z,(var(i),i=1,nvari)
其中
nvari=3
。但是,如果在某些情况下,我实际上有4个变量(即,
nvari=4
)。我想这样写:

write(*,'(3f15.3,nvari(f9.2))') x,y,z,(var(i),i=1,nvari)
write(*,'(3f15.3,nvari(f9.2))') x, y, z, (var(i), i=1,nvari)

现在,
nvari
可以是任何东西,输出将按我喜欢的方式工作。我怎样才能使这样的东西工作?

如果您的编译器支持它,
'(3f15.3,*(f9.2))

如果您使用的是较旧的编译器,则只需使用比要输出的项更多的数字,例如,
”(3f15.3999(f9.2))“
。你不必用尽格式

对于最复杂的情况,您可以将格式写入字符串并将其用作格式:

write (string, '( "(3f15.3, ", I4, "(f9.2))" )' )  nvari
write (*, string )  x,y,z, (array(i), i=1,nvari)

了解格式(包括格式反转)后,很少需要使用字符串格式。

也可以使用字符变量,而不是直接在write语句中写入格式

character(len=32) :: my_fmt
my_fmt = '(3f15.3,3f9.2)'
write(*, my_fmt) x, y, z, (var(i), i = 1, nvari)
现在可以使用所谓的“内部写入”或“写入内部文件”操作字符变量,以在write语句之前包含所需的重复计数

write(my_fmt, '(a, i0, a)') '(3f15.3,', nvari, 'f9.2)'

(只需确保声明的my_fmt长度足以包含整个字符串即可。)

如果您使用的是英特尔fortran,它为此提供了一个专有的扩展名--您可以在尖括号中包含一个现有变量作为说明符:

  write(*,'(3f15.3,<nvari>f9.2)') x,y,z,(var(i),i=1,nvari)
write(*,”(3f15.3,f9.2)“x,y,z,(var(i),i=1,nvari)

您想写这样的东西:

write(*,'(3f15.3,nvari(f9.2))') x,y,z,(var(i),i=1,nvari)
write(*,'(3f15.3,nvari(f9.2))') x, y, z, (var(i), i=1,nvari)
事实上,Fortran标准中有一个老把戏,允许您省略
nvari
,因此:

write(*,'(3f15.3,(f9.2))') x, y, z, (var(i), i=1,nvari)
甚至如此:

write(*,'(3f15.3,f9.2)') x, y, z, (var(i), i=1,nvari)
该标准规定,格式中的最后一个描述符会根据需要隐式重复,以容纳列表中的所有变量。该“最后一个描述符”可以插入括号,以便隐式重复最后一组描述符,例如:

write(*,'(3f15.3,(2x,f9.2))') x, y, z, (var(i), i=1,nvari)

3
4
是唯一的选择吗?或者您正在寻找可以处理任何数字的东西?OP指定的“nvari可以是任何东西”。或者,在最后一条(括号)语句中,使用可分配的长度字符变量。@HighPerformanceMark:当然,如果您的编译器支持它,这将是最好的解决方案。对于使用gfortran编译器的人,此解决方案是gfortran文档中推荐的解决方案。请参阅文档中的“变量格式表达式”(第6.2.3节针对gfortran 4,第6.2.3节针对gfortran 5;第6.2.2节针对gfortran 6)。我警告不要写入字符串。Mac上的Gfortran对于写入字符串变量而言不是线程安全的。文件的I/O似乎是线程安全的,而不是字符串。酷。谢谢。我使用的是英特尔Fortran编译器,我认为它是最新的。但无论如何,它不执行“(3f15.3,*(f9.2)),所以我使用第二个解决方案。顺便问一下,你说的“格式转换”是什么意思?我在谷歌上搜索了一下,但没找到多少。哦,酷。谢谢你的回答。这正是我想要的。有没有办法在
上做一些数学运算?例如-
+2
,或
3*
**2
在格式语句中?我用括号试了一下。。那不行!编辑:我现在使用的解决方法是定义另一个整数变量
nfmt
,并使用它而不是
nvari
是否有方法使用gfortran编译器使用
a
样式格式?如果您来寻找解决方案,请参阅其他答案,这个答案在gfortran和其他一些编译器中不起作用。这帮助我认识到我的FORMAT语句是什么。但现在我必须切换编译器:(我使用的是
gfortran9
。除非像第二个示例中那样使用括号,否则这对我来说不起作用。它还会在新行而不是在同一行上生成重复输出,这不是OP想要的。