Fortran输入/输出中*的目的是什么

时间:2015-12-23 12:50:48

标签: fortran

我正在学习Fortran,因为,是的,我以为我会学习它。但是,我发现完全没有关于*在打印,阅读等方面的用途的信息:

program main

    print *, "Hello, world!"

end program main

这个*的目的是什么?我做了一些研究,但我认为我没有理解它,我不想继续学习,直到我真正知道*的要点。

从我设法找到的,我认为它是某种格式说明符,然而,我不明白这意味着什么,我不知道我是否正确。我发现的所有教程都告诉我要写什么来打印到控制台但不是*实际意味着什么。

2 个答案:

答案 0 :(得分:3)

你是正确的,因为它是格式说明符。

在Wikibooks上有一个与IO有关的页面,其中说明:

  

第二个*指定用户希望使用

读取的数字的格式

在谈论read声明时。这也适用于writeprint语句。

  

对于定点实数:Fw.d; w是分配给该数字的空格总数,d是小数位数。

他们给出的例子是

REAL :: A
READ(*,'(F5.2)') A

读取小数点前后2位数的实数。因此,如果您要打印一个实数,您可以使用:

PRINT '(F5.2)', A

获得圆形输出。

在您的示例中,您只是打印文字,因此无法执行特殊格式设置。此外,如果您将格式说明符保留为*,则会将默认格式应用于实数等。

答案 1 :(得分:2)

print语句将输出格式化为特殊位置(我们假设是屏幕)。有三种方法可以指定此输出中使用的格式。其中一个问题就是使用*

*格式说明符表示格式化的输出将是所谓的 list-directed 输出。相反,对于read语句,它将是列表导向的输入。现在已经引入了这个术语,你可以在这里找到许多其他问题:列表导向的输入/输出有许多可能令人惊讶的后果。

通常,格式规范项说明如何格式化输入/输出列表中的项。如果我们写出一个实数,我们会使用一个格式项,可能会说出输出的精度或是否使用科学记数法。

在问题中,当写出一个字符变量时,我们可能想要指定输出字段的宽度(以便有空白填充或部分输出)。我们可以

print '(A20)', "Hello, world!"
print '(A5)', "Hello, world!"
print '(A)', "Hello, world!"

提供一系列效果。 [使用像'(A)'这样的文字字符常量是提供格式的其他方式之一。]

但我们不能

print '(F12.5)', "Hello, world!"   ! A numeric format for a character variable

因为我们的格式对输出项没有意义。

列表导向输出与上述情况不同。相反,(此处以及后来的Fortran 2008标准草案中引用)

  

允许根据列表项的类型而不是格式规范进行数据编辑。它还允许数据为自由字段,即用逗号(或分号)或空格分隔。

主要的效果,以及为什么列表导向是如此方便,是程序员不需要努力为要发送的东西制作合适的格式。

当在列表导向的输出下处理输出列表并且出现实际值时,就好像程序员为该值提供了合适的格式。对于其他类型也一样。

但这里至关重要的是“合适的格式”。最终用户无法说出A5F12.5。而不是后者,编译器可以为宽度,精度等选择“合理的处理器相关值”。 [导致诸如“为什么这么多空白?”之类的问题。]。输出的限制在例如Fortran 2008 10.10.4中给出。

因此,总结*说,以合理的方式打印出以下内容。我不会抱怨你如何选择这样做,即使你给我输出像

 5*0
      1     2

而不是

 0 0 0 0 0 1 2

我当然不会抱怨像

这样的领先空间
 Hello, world!

而不是

Hello, world!

对于,是的,在列表导向的情况下,您将(在超出此答案的情况下除外)在输出中获得初始空白:

  

除了[特殊情况]创建的新记录或分隔字符序列的延续外,每个输出记录都以空白字符开头。