首页 > 教程 > 正文

阅读排行

随心所欲控制 write(*,*)
2014-01-20 10:48:55   来源:Fcode研讨团队   评论:0 点击:

本文讨论了在 Windows 的主流编译器上,如何控制默认的 write 行为。以便让函数库出错信息不显示在 Console 界面。本文所涉及内容可能超出Fortran语法范畴,请确认自己使用的编译器是否允许。

最近几天群里一个可爱的网友遇到了一个问题。他使用 IVF 编译 DLL,C# 编写 GUI 调用,始终出错。纠其原因,是由于 IMSL 里使用了若干 write(*,*) 输出信息,而 GUI 程序没有 Console 窗口,遇到控制台输出就出错。

就像下面的图片这样:

\


我们都知道 IMSL 的代码我们是无法修改的,那么我们要使用 IMSL 怎么办呢?

经过多次的实验和探讨,总结了一些经验。

首先看Intel官方的解释:

http://software.intel.com/en-us/articles/cannot-write-to-window-created-with-allocconsole/

Intel说,在程序开始时调用 AllocConsole 创建一个窗口,以便看到控制台输出。

也就是这段代码:

Use Kernel32
Integer :: iRes
iRes = AllocConsole()

有了以上代码,当运行 GUI 的时候,就会弹出一个黑色的 Console 窗口。以后GUI程序就可以直接使用 write(*,*) 进行屏幕输出了。

我写了个测试程序,一个 GUI 对话框,Say Hello 按钮的回调主要执行一个输出语句:

write(*,*) 'Hello'

效果如图(我点了5次)

\


但是这样的效果似乎不是很完美,我想大多数写GUI的人都不愿意看到那个黑色的Console窗口吧?

可是万恶的IMSL代码已经包含了write(*,*),商业函数库的性质决定我们无法修改,无法删除write语句。

只好另外想办法。

去掉 AllocConsole,加入以下代码:

 iRes = GetStdHandle(STD_OUTPUT_HANDLE)
  iRes = CloseHandle(iRes)

前一句意思是打开一个 NUL 的文件,后一句是把它的句柄设置为标准输出,这是两个API函数。

编译之后运行,发现没有Console窗口,并且也没有 write 屏幕输出了。所有 write 语句就和没有存在一样!!讨厌的IMSL提示也消失了!!

当然,如果觉得有必要,可以把 CreateFile 函数的第一个参数 NUL 文件改成 log.txt。这样可以达到把IMSL提示输入到文件中以便查看的目的。


以上是针对 Intel Fortran 编译器的,我一直钟爱的小家碧玉Ftn95,就更简单了,因为它的 * 其实就是通道 2

我们只要一开始就自己打开通道2就可以重定向屏幕输出。

Program www_fcode_cn
  Implicit None
  Open(2,File="NUL") !// 打开通道2,重定向
  write(6,*) 'Hello , boy !'
  write(*,*) 'Can you see me?' !//用 write(* 输出的就看不到了!
  write(6,*) 'good bye?'
End Program www_fcode_cn

在编译的时候,Ftn95还会给出一句警告:

Compiling file: FreeFormat1.f95
D:\Ourdoc\桌面\FreeFormat1.F95(3) : warning 868 - Opening unit 2 may affect the operation of output to the default unit '*' - are you sure you want to do this?

不用管这个警告,运行程序以后,会发现第二个输出语句没有效果。如图:

\

实际上,现在 Fortran2003 标准中已经有一个比较好的内部模块:ISO_FORTRAN_ENV
他包含一个常数,叫做 OUTPUT_UNIT,如果每次输出都用它做为通道号,而不使用 * 的话,重定向就非常简单了。


Program www_fcode_cn
  Use , Intrinsic :: ISO_FORTRAN_ENV
  Implicit None
  !Open( OUTPUT_UNIT , file = 'nul' )
  write(6,*) 'Hello , boy !'
  write(*,*) 'Can you see me?'
  write(OUTPUT_UNIT,*) 'good bye?'
End Program www_fcode_cn


这个特征比较麻烦,不过很希望大家都接受和使用。


祝那位老兄程序顺利...信 Fortran Coder,一定码到成功!

相关热词搜索:Fortran write Console 函数库

上一篇:第一页
下一篇:程序设计的几个基本概念

分享到: 收藏