Viktor的Fortran手记之五 IFC可视化设计(二)
5 连接变量和对话框
对话框必须连接到变量上。变量的类型是
并且定义在IFLOGM.F90模块中。(CFC是定义在DIALOGM模块中)具体的连接方式如下:
include 'resource.fd' !默认的资源文件头
type(dialog) dlg
logical retlog
retlog = DlgInit(IDD_WINDOW, dlg)
6 使用对话框的一般过程
- 建立TYPE(dialog)型变量,并调用DlgInit或DlgInitWithResourceHandle函数连接对话框。
- 用DlgSet等手段,赋予控件初始值。
- 使用DlgSetSub函数,规定控件响应回调程序。
- 显示对话框。模态可用DlgModal,无模态情况下用DlgModeless函数调用,并在消息处理例程中增加DLGISDLGMESSAGE事件。
- 用DlgGet等手段取用控件值。
- 用DlgUninit释放对话框。(必要!)
7 Edit和Static
这些都是最普通的控件,使用时,没有必要附加属性指定,因为得以存取的,无非是字串(对应字串型)。DlgGet与DlgSet是重载函数。如果用逻辑型变量存取,修改的是Enabled属性。IFC Documentation给出了一个内部读写的例子,插在事件处理回调程序中:
character(256) text !按Viktor的习惯还是写character(len=256)好
logical retlog
select case (control_name)
case (IDC_EDIT_CELSIUS)
retlog = DlgGet(dlg, IDC_EDIT_CELSIUS, text) !将Edit内容装入text中
read (text, *, iostat = retint) cel !所谓“内部读取”,其实是数据转化过程
if (retint .eq. 0) then !成功,以免没有读到正确的值
far = (cel - 0.0) * (212.0 - 32) / 100.0 + 32.0 !为什么不化简?
write (text, *) far !内部输出。不用判断了。
retlog = DlgSet(dlg, IDC_EDIT_FAR, trim(adjustl(text))) !左对齐好看
end if
!下略
end select case
Viktor的Fortran手记之四 IFC可视化设计(一)
呵呵……原来在日文版的浏览器下FCKEditor也会变日文版的……很好很强大……
下列内容根据Intel(R) Visual Fortran Compiler Documentation编译。
1 控件类型支持
除ActiveX外,Intel Visual Fortran Compiler(以下简称IFC)支持十五种控件:
- Button
- Check box
- Combo box
- Edit box
- Group box
- List box
- Picture
- Progress bar
- Radio button
- Scroll bar (horizonal)
- Scroll bar (vertical)
- Slider
- Spin control
- Static text
- Tab control
2 控件值的取用: DLGGET()
注意,该东西是个函数,返回逻辑型(.true.对应“成功”,.false.对应“成仁”)。需要什么,应该写成参数。写法是
比如
需要注意的是,读EDIT控件只能读字符串,存到字符串(一般可用txt之类的名字)中。需要数值时再用read读数值:
...
retlog = DlgGet(dlg, IDC_EDIT_TOL, text)
!因为Edit的默认属性就是框里的内容
read (text, *) tol
3 将H文件转化为FD文件
IFC提供DEFTOFD程序。是不是自动的,没试,不敢说。
4 主程序要求
必须
也必须包含.fd文件,如
Viktor的Fortran手记之三 风格、选择与效果
- 用
以绕过I--N规则。(呵呵,一句名言,"God is Real until claimed as Integer. "嗯……然则min一类习惯的名字就要小心了……)
- 在subroutine和function里,所有的local var.都默认是STORE的。什么意思呢?比如说,
function xxoo(...)
...
integer :: ooxx = 1
...
ooxx = ooxx + 1
...
end function xxoo
只有第一次xxoo(...)的时候,ooxx才是1.以后就会变成2,3,4,5,……如果要避免这个副作用,就得写
...
integer :: ooxx
...
ooxx = 1 !Here to initialize ooxx
...
end function xxoo
C里面可是默认全都毁掉的,不要混了……
- 有的地方说inout要写成in out,goto要写成go to,然则得视编译器而定。
- 注释写感叹号,续行就用&,从第9列写起(兼容Tab和古典FORTRAN格式)。第5列(按一个Tab)写行号的个位。第6列一定要让它空着!除非续行的时候,可以写&。需要兼容性的时候,这是必须的。
- 虽然新Fortran支持长名字,然则还是写6字符以内的短名比较好。小猫见过hankei和takasa之类诡异的名字……
- 循环里严格禁止改循环变量:
do i = 1, n
i = exFlag !Compile error!
...
end do - 最应该记住的,是调用function的时候得事先在块中声明……
- module是个好东西,声明什么的都可以往里装。还可以用它实现运算符重载和多态函数……C++用的是类,这里用的就是TYPE……
Viktor的Fortran手记之二 从FORTRAN到Fortran
(接上回……)
话说搞到了编译器之后,才发现全是F90的编译器。而且在科学界使Fortran的人也不少。据说Fortran在数值算法里也比C快一点。从77改成90吧。大字的FORTRAN也改成了小字的Fortran.
编译器嘛,是IFC和CFC。CFC太老了,95年的,很怀旧,但是在Vista下好歹还能正常工作,除了没办法运行和调试之外。IFC要嵌入到VS里用。Compaq也出过一版VFC,那个要嵌到VS 6里的,偶没装VS 6,当然要报错啦……
续行一律用&。什么第6列用+的办法,恐怕已经土偶了吧……
所谓Vector Subscription和Segment很有意思。然则CFC对Segment的处理不是很好。
do 9, **** 之类的文法已经obsolute了……同样还有character*9之类。
比C省事的地方是数组可以整个处理。还有Implied DO,也是个很好的特性。
其实VB的一些特性和Fortran是相通的。比如块结构的IF。
做C太久了,写if的时候总是忘then.
还有C里{}搞定的东西在Fortran中却要有专门的符号……
搞来了编译器,做了课本上的几个题目。要尝试一下Windows开发。
Viktor的FORTRAN手记之一 引子
Viktor其实也刚刚入门……要不是做科学,纯开发的话Viktor一辈子也不会碰这东西……先说说FORTRAN和C不一样的几个地方吧……目前Viktor还停留在纸上谈兵的阶段,因为暂时找不到Vista下好用的FORTRAN编译器……最近几天也在一直找。经典的Visual Fortran就是不和Vista兼容……总不能因为这点破事开个虚拟机吧……卡到在其次,怕的主要是发热。
- 不用打;以结束语句。
- 实用的语句要空六格。也就是说,得打上六个空格才能开门见山……好像也不要写到70列还是什么的……续行怎么续来着?
- 行首打*表示注释。
- 程序的第一行一定是
program ooxx - 做完的时候还得
stop再
end - 调用子程序要
call xxoo
- 子程序还得写成
subroutine xxoo
...
return
end - 打印居然要加个"*,",还得用print,而且更神奇的是自动换行。
- 名字不许超过6个字母。
- 传统中的I~N规则……I,J,K,L,M,N打头的是整数……
- 有乘方运算符……然则要写成**……
- 除法取整时一律向下取整。
- DO循环要写出CONTINUE的行号……DO 100 I=1,5
- 整数叫integer
- 字符串和字符居然一样……声明要写
character*5 ooxxx - 更强大的是居然用单引号围住字符串(而不是C中的双引号)……