我在使用Fortran 90和Eclipse方面遇到了一些小问题。我在Eclipse中安装了“Photran”插件,并设法完美地编译了所有内容,整个程序完成了它必须做的事情。在Eclipse控制台中显示文本时出现问题。它本身的代码并不重要,因为它完成了它必须做的事情,但更多的是输出生成。
我遇到问题的代码如下:
subroutine main_program
write(*,*) "Program begins!"
<Program that takes ~5mins to run>
write(*,*) "Program ends!"
end subroutine main_program
具体来说,问题是在控制台中,第一条消息应立即显示,“程序开始!”,大约5分钟后应显示“程序结束!”。碰巧这两条消息只在程序运行完毕后才显示,而不是在程序执行时显示。
我用过:
subroutine main_program
print*, "Program begins!"
<Program that takes ~5mins to run>
print*, "Program ends!"
end subroutine main_program
但它继续做同样的事情。我之前看过一篇“类似”的帖子(虽然找不到链接,对不起),但这并不是我想要的。
答案 0 :(得分:0)
好的,这是答案。插入声明
flush 6
在第一个write
语句之后将其输出立即发送到控制台。一旦你理解了它的作用,就把它插入你想要的任何地方。
很明显(对我来说)情况OP描述了输出被缓冲,即程序发出write
语句并将输出传递给操作系统,因为它很好 - 在此之前,它等待程序结束,然后再将任何内容写入控制台。我猜它的缓冲功能有一些限制,如果程序超出它们,o / s会在程序结束前清空缓冲区。
Fortran现在(自2003年以来我认为)提供了一种告诉o / s实际将缓冲区刷新到输出设备的标准方法 - flush
语句。最简单的形式flush
只接受一个参数,即要刷新的输出通道的单元号。我猜测OP已将单元6连接到stdout
(又名*
),因为这是一种近乎通用的默认配置,但Fortran语言标准并不能保证这一点。
我不认为flush *
是正确的。
如果你有一个2003年之前的编译器,那么(a)用于Backus&#39;更新和(b)它可能支持一种非标准的方式来刷新缓冲区;如果内存服务gfortran
用于提供一个类似call flush(6)
的子例程。
在Fortran之外还有其他方法可以告诉o / s立即写入磁盘(或控制台或你有什么)。如果您对它们感兴趣,请查看您的o / s的文档。