就像下面的图片这样:
我们都知道 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,一定码到成功!