【问题标题】:Output is '*' when writing a real to a string将实数写入字符串时输出为“*”
【发布时间】:2017-01-10 14:40:40
【问题描述】:

我有一个真实的CURRENTTIME,我想转换为一个名为TIMEDIR 的字符串。由于TIMEDIR 必须更改大小,所以它是可分配的。据我所知,分配工作正常。另外,我检查了CURRENTTIME 是否有值。

ALLOCATE(CHARACTER(LEN=1)::TIMEDIR)
WRITE(TIMEDIR, '(F1.0)') CURRENTTIME

但是

WRITE(*,*) TIMEDIR

输出*,它应该是0CURRENTTIME 是 0.0000000)。我不知道问题是什么。

【问题讨论】:

  • 你确定 TIMEDIR 有值吗?
  • 是的,它的值为 "*" ...

标签: fortran


【解决方案1】:

您将输出写为浮点数。浮点数总是有一个小数点或一个指数来将它们与整数区分开来。因此,浮点数的最窄输出可能是 0.,即 2 个字符,并且 F1.0 格式将始终导致打印“*”,因为字段宽度不足以容纳正在写入的内容。

【讨论】:

  • = INT()
【解决方案2】:

Ian Bush's answer 说明了您需要知道的内容:使用F 编辑描述符输出实数值需要至少为 2 的字段宽度。我将在其他方面详细说明。

你提到

TIMEDIR 必须改变大小,它是可分配的

但是在我们看到的代码片段中

WRITE(TIMEDIR, '(F1.0)') CURRENTTIME

这表明存在一些误解。 [可能没有混淆,但我会为任何其他读者的利益而努力这一点。]

当输出格式看起来像 Fw.d for w 大于零时,输​​出字段的宽度总是 w。这个“总是”的意思是:无论对应变量的值是什么,上面的write 语句对TIMEDIR 的影响是有一个非空白字符。

现在,与其他答案一样,2 是输出实数值的最小字段宽度[1]。与所有其他数字输出格式一样,如果字段的宽度不足以容纳相应的值,则该字段完全由 *s 组成。 F1.0 将始终导致输出 *。如果你想输出0.(或0,[2],你需要F2.0

回到“TIMEDIR 的可变大小”,输出格式 F2.0 (可能)对于小于 10 的非负值 CURRENTTIME 是足够的,但对于负值或不小于 10 的值不是。很可能这就是F0.d 的用武之地。只有这种形式的F 编辑描述符,字段的宽度才取决于输出值。不过,这可能是另一个问题的答案。

最后,正如你所说的

我必须弄清楚如何将“0”变成“0”。

我会指出您正在考虑必须执行一些额外的逻辑,例如mentioned elsewhere


1 2 可能还不够,即使是零值:print '(SP,F2.0)', 0.

20.0,的选择取决于十进制模式:print '(DC,F2.0,DP,F2.0)', 0., 0.

【讨论】:

  • 感谢您提供更多信息。但是,F0.d 打印什么?由于 CURRENTTIME 在 0 到 3 秒之间,我不必担心值会大于 10。
  • F0.d 的行为与Fw.d 非常相似,但该字段的宽度不是w,而是小于*s 的最小宽度。因此,没有前导/尾随空格,但有 d 小数位。
猜你喜欢
  • 2011-05-03
  • 1970-01-01
  • 1970-01-01
  • 2017-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-29
相关资源
最近更新 更多