2012-03-26 57 views
11

我想要Fortran写入语句的格式取决于某个变量。例如,我可以这样写:依赖于变量的输出的格式字符串

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) 

现在,nvari可以是任何东西,输出将工作,因为我喜欢。我怎样才能做出这样的作品?

+1

是'3'和'4'唯一的选择?或者你在寻找能处理任何数字的东西吗? – sarnold 2012-03-26 23:21:52

+1

OP指定'nvari可以是任何'。 – patrickvacek 2013-09-16 17:35:06

回答

14

如果使用的是英特尔Fortran,它有这样的专有扩展 - 您可以在尖括号现有变量充当符:

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

哦,很酷。谢谢你的回答。这正是我想要的。 – 2012-04-19 22:39:13

+0

有没有办法在''上做一些数学运算? 例如,在格式声明中,“ + 2”或“3 * ”或“ ** 2”我尝试了一个括号..没有工作! 编辑:我现在使用的解决方法是定义另一个整数变量'nfmt'并使用它而不是'nvari' – 2013-10-21 10:02:01

+0

有没有办法使用'A '格式使用gfortran编译器? – Chris 2017-08-29 11:44:24

10

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

如果你有一个旧的编译器,只需使用一个更大的数量比你有项目输出,例如,'(3f15.3, 999(f9.2))'。您不必使用格式。

对于最复杂的情​​况下,你可以编写一个格式为字符串,并使用它作为您的格式:

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

随着格式的了解,包括格式回复,使用字符串格式很少是必要的。

+0

很酷。谢谢。我正在使用英特尔Fortran编译器,我认为它很新。但无论如何,它不会做'(3f15.3,*(f9.2))',所以我正在使用第二种解决方案。顺便说一句,“格式回复”是什么意思?我做了一些Google搜索,但没有提出太多。 – 2012-03-27 16:28:16

8

除了直接在写入语句中写入格式外,还可以使用字符变量。

character(len=32) :: my_fmt 
my_fmt = '(3f15.3,3f9.2)' 
write(*, my_fmt) x, y, z, (var(i), i = 1, nvari) 

现在可以操纵字符变量写语句之前包含想要的重复次数,使用所谓的内部写,或者写内部文件。

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

(只要保证的my_fmt声明长度足够长,以包含整个字符串)

+1

或者,对于最后一个(括号内)语句,请使用allocatable-lenght字符变量。 – 2012-03-27 04:27:55

+0

@HighPerformanceMark:当然,如果你的编译器支持它,那将是最好的解决方案。 – eriktous 2012-03-27 10:57:24

+1

对于那些使用gfortran编译器的人来说,这个解决方案是gfortran文档中推荐的解决方案。请参阅文档中的“变量FORMAT表达式”(第6.2.3节gfortran 4,gfortran 5;第6.2.2节gfortran 6)。 – 2017-05-26 19:38:15

4

你想写的东西是这样的:

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)