输出是' *'当写一个真实的字符串

时间:2017-01-10 14:40:41

标签: fortran

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

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

但是

WRITE(*,*) TIMEDIR

输出*,其中应为0CURRENTTIME为0.0000000)。我不知道问题是什么。

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

Ian Bush's answer说明了你需要知道的事情:使用F编辑描述符输出实际值需要至少为2的字段宽度。我将在其他方面详细说明。< / p>

你提到

  

由于TIMEDIR必须改变大小,因此可以分配

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

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

这表明存在一点误会。 [可能没有混淆,但我会为了任何其他读者提出问题而努力。]

如果Fw.d的输出格式大于零w,则输出字段的宽度总是 w。这个“总是”意味着:无论相应变量的值如何,上面write语句对TIMEDIR的影响都是单个字符为非空白。

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

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

最后,正如你提到的那样

  

我必须找出如何从“0”中取出“0”。

我会指出你需要做一些额外的逻辑,比如mentioned elsewhere

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

2 0.0,的选择取决于小数模式:print '(DC,F2.0,DP,F2.0)', 0., 0.