Fortran和Eclipse:在控制台中显示文本

Fortran和Eclipse:在控制台中显示文本,eclipse,text,console,fortran,Eclipse,Text,Console,Fortran,我在使用Fortran 90和Eclipse时遇到了一点小困难。我在Eclipse上安装了“Photran”插件,并成功地将所有内容都编译得非常完美,总体而言,程序完成了它必须完成的任务。在Eclipse控制台中显示文本时会出现问题。代码本身并不重要,因为它完成了它必须做的事情,但更重要的是输出生成 我遇到问题的代码如下: subroutine main_program write(*,*) "Program begins!" <Program that takes ~5m

我在使用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
子程序主程序
打印*,“程序开始!”
打印*,“程序结束!”
结束子程序主程序

但它一直在做同样的事情。我之前看到过一篇“类似”的帖子(虽然找不到链接,但很抱歉),但这不是我真正想要的。插入语句

flush 6
在第一个
语句之后,编写
语句,使其输出立即发送到控制台。一旦你明白了它在做什么,就把它插入你想要的任何地方

从OP描述的情况来看,很明显(对我来说)输出正在被缓冲,也就是说程序发出一个
write
语句,并将输出传递给操作系统,操作系统可以随心所欲地进行操作——在这里,它等待程序结束,然后再将任何内容写入控制台。我猜它的缓冲能力有一些限制,如果程序超过这些限制,o/s将在程序结束之前清空缓冲区

Fortran now(我想是从2003年开始)提供了一种标准的方法,告诉o/s将缓冲区实际刷新到输出设备--
flush
语句。最简单的形式是
flush
只接受一个参数,即要刷新的输出通道的单元号。我猜OP的第6单元连接到了标准输出(又称为标准输出),因为这是一个近乎通用的默认配置,尽管Fortran语言标准不能保证

我认为
flush*
不正确

如果您有一个2003年以前的编译器,那么(a)为了备份更新,(b)它可能支持刷新缓冲区的非标准方式;如果内存用于
gfortran
,则用于提供一个子例程,该子例程的调用类似于
调用flush(6)


除了Fortran之外,还有其他方法可以告诉o/s立即写入磁盘(或控制台或您拥有的东西)。如果您对o/s感兴趣,请查看这些文档。

好的,下面是答案。插入语句

flush 6
在第一个
语句之后,编写
语句,使其输出立即发送到控制台。一旦你明白了它在做什么,就把它插入你想要的任何地方

从OP描述的情况来看,很明显(对我来说)输出正在被缓冲,也就是说程序发出一个
write
语句,并将输出传递给操作系统,操作系统可以随心所欲地进行操作——在这里,它等待程序结束,然后再将任何内容写入控制台。我猜它的缓冲能力有一些限制,如果程序超过这些限制,o/s将在程序结束之前清空缓冲区

Fortran now(我想是从2003年开始)提供了一种标准的方法,告诉o/s将缓冲区实际刷新到输出设备--
flush
语句。最简单的形式是
flush
只接受一个参数,即要刷新的输出通道的单元号。我猜OP的第6单元连接到了标准输出(又称为标准输出),因为这是一个近乎通用的默认配置,尽管Fortran语言标准不能保证

我认为
flush*
不正确

如果您有一个2003年以前的编译器,那么(a)为了备份更新,(b)它可能支持刷新缓冲区的非标准方式;如果内存用于
gfortran
,则用于提供一个子例程,该子例程的调用类似于
调用flush(6)


除了Fortran之外,还有其他方法可以告诉o/s立即写入磁盘(或控制台或您拥有的东西)。如果您对o/s感兴趣,请查看这些文档。

非常感谢!经过两年的探索,我终于勇敢地提出了这样一个愚蠢的问题。谢谢你,先生,这有帮助吗?指定您的操作系统和编译器会很有帮助。它确实有帮助,而且很有效。我使用的是GCC Fortran、Windows 7(64位)、Intel i7。希望这有帮助,或者如果你需要更多的信息,我可以给你。非常感谢!经过两年的探索,我终于勇敢地提出了这样一个愚蠢的问题。谢谢你,先生,这有帮助吗?指定您的操作系统和编译器会很有帮助。它确实有帮助,而且很有效。我使用的是GCC Fortran、Windows 7(64位)、Intel i7。希望这有帮助,或者如果你需要更多的信息,我可以给它。