dvbbs
收藏本页
联系我们
论坛帮助
dvbbs

>> Fortran语言使用经验交流
搜一搜相关精彩主题 
Fortran中文网Fortran中文网—Fortran语言经验交流Fortran语言使用经验交流 → FORTRAN是世界上最早出现的高级编程语言,是工程界最常用的编程语言,它在科学计算中(如航空航天、地质勘探、天气预报和建筑工程等领域)发挥着极其重要的作用

您是本帖的第 6373 个阅读者
树形 打印
标题:
FORTRAN是世界上最早出现的高级编程语言,是工程界最常用的编程语言,它在科学计算中(如航空航天、地质勘探、天气预报和建筑工程等领域)发挥着极其重要的作用
zj79
帅哥哟,离线,有人找我吗?
等级:论坛游民
文章:50
积分:566
门派:无门无派
注册:2005年12月28日
楼主
 用支付宝给zj79付款或购买其商品,支付宝交易免手续费、安全、快捷! 点击这里发送电子邮件给zj79

发贴心情
FORTRAN是世界上最早出现的高级编程语言,是工程界最常用的编程语言,它在科学计算中(如航空航天、地质勘探、天气预报和建筑工程等领域)发挥着极其重要的作用
FORTRAN是世界上最早出现的高级编程语言,是工程界最常用的编程语言,它在科学计算中(如航空航天、地质勘探、天气预报和建筑工程等领域)发挥着极其重要的作用。经过40多年的发展,伴随着FORTRAN语言多次版本的更新及相应开发系统的出现,其功能不断完善,最新版本的开发系统几乎具备了VC、VB的所有特点,如图形界面编程、数据库等。目前,工科院校开设的计算机编程语言课首选仍然是FORTRAN。
ip地址已设置保密
2005/12/28 22:12:59
zj79
帅哥哟,离线,有人找我吗?
等级:论坛游民
文章:50
积分:566
门派:无门无派
注册:2005年12月28日
2
 用支付宝给zj79付款或购买其商品,支付宝交易免手续费、安全、快捷! 点击这里发送电子邮件给zj79

发贴心情
何为Fortran

  所谓Fortran即是Formula Translation之意,是一套着重运算能力的一套软件包,也就是说是一套可将我们所写的一组高级语言转译为机械语言进而执行的软件,当然,Fortran有一套自己的语法,所以,在使用Fortran之前必须先了解Fortran基本的语法,而Fortran的语法在工作站上和在个人计算机上是一样的。

ip地址已设置保密
2005/12/28 22:13:36
zj79
帅哥哟,离线,有人找我吗?
等级:论坛游民
文章:50
积分:566
门派:无门无派
注册:2005年12月28日
3
 用支付宝给zj79付款或购买其商品,支付宝交易免手续费、安全、快捷! 点击这里发送电子邮件给zj79

发贴心情
Fortran 程序编辑

  

一般在个人计算机上,Fortran的程序可在任何文书处理系统上编辑,如 dos的 edit编辑器、pe2编辑器、支持 windows 的 word文书处理系统等等,而在工作站上则键入 vi file-name 直接编写程序,另外在 vax-9420 大计算机的系统上则是直接用 edit 加以编辑。

ip地址已设置保密
2005/12/28 22:13:55
zj79
帅哥哟,离线,有人找我吗?
等级:论坛游民
文章:50
积分:566
门派:无门无派
注册:2005年12月28日
4
 用支付宝给zj79付款或购买其商品,支付宝交易免手续费、安全、快捷! 点击这里发送电子邮件给zj79

发贴心情
Fortran 程序之编译 Compile

我们所写的程序皆是属于高阶的语言,是无法直接执行的,想要执行所编写的程序则必须经过编译过程,将所写的高级语言转化为低阶的机械语言,这样的语言计算机才认得,也才有办法加以执行,至于Fortran在工作站上的编译方式如下之形式,假如我们有一个档名为 pp.for的程序:

f77 pp.for

如上的编译过程计算机自动会将执行文件写在一个名为 a.out 的档案,若想将所编译过的执行档另外给予一个新的档案,除了在编译过后将 a.out 档案加以更改档名之外,亦可以直接在编译的过程中加以更改,其编译过程如下:

f77 -o pp pp.for

上述中pp为编译过后之可执行档档名,当然不一定为pp,可为任意自定的一个档名,值得注意的一点是上述指令中,f77 与 -o 皆必须为小写。若所写的程序当中有叫用 IMSL 链接库中的子程序时,在编译的过程中则又必须加一些参数如下:

f77 -o pp pp.for -limsl

另外在 f77 后面可加其它的参数以执行其它的功能,举例如下:

-  表示最佳化
-g 表示在编译时自动除错

Fortran 在不同的机器上其编译过程一有所不同,我们可以用 Fortran 在 Vax9420 上的编译过程来做比较,同样的我们假设有一个 pp.for 的Fortran 程序,在 Vax9420 上的编译过程如下:

fortran pp.for
link pp

如果有叫用 IMSL 链接库则编译过程如下:

fortran pp.for
link pp,imslv/lib

执行时则键入:

run pp

ip地址已设置保密
2005/12/28 22:14:06
zj79
帅哥哟,离线,有人找我吗?
等级:论坛游民
文章:50
积分:566
门派:无门无派
注册:2005年12月28日
5
 用支付宝给zj79付款或购买其商品,支付宝交易免手续费、安全、快捷! 点击这里发送电子邮件给zj79

发贴心情
Fortran 常犯的错误

A.      Fortran 最常犯的错误是变量使用的错误,比如说某变量 aa 在宣告时 位整数,而在程序中物当作实数使用。

B.      某变量在程序中使用了,但是却忘了宣告。

C.      程序写的太长超过了72行的限制或是连结的两行忘了在第六行加上连结的符号。

D.     在复杂的程序中刮号的错误。

E.      在循环控制中,因变量的不当控制而导致的无限循环。

F.      在循环控制中,因不慎在不同的回圈中使用了相同的地址。

G.     两个选择性控制或两个循环性控制产生了交集。

H.      在一个循环性回圈中包含有另一个回圈时,两个回圈不慎使用了相同的控制变量。

I.        程序中不慎产生了奇异值(某数除以零)或产生不收敛值而爆掉的情况。

J.       使用子程序时,主程序与子程序相对的变量有不同的宣告值。

K.      变量的长度过长。

L.      不完整的回圈结构,比如说在 if 的结构中漏掉了 then 或 endif 。

M.    将整数当实数处理而产生的数值上的错误,比如说变量 a 和 b 宣告为整数,则 a 除以 b时的商取整数部份,小数部份则略去而产生错误。

N.     输出或输入的格式码错误。

ip地址已设置保密
2005/12/28 22:14:16
zj79
帅哥哟,离线,有人找我吗?
等级:论坛游民
文章:50
积分:566
门派:无门无派
注册:2005年12月28日
6
 用支付宝给zj79付款或购买其商品,支付宝交易免手续费、安全、快捷! 点击这里发送电子邮件给zj79

发贴心情
MS FORTRAN 图形功能介绍

  FORTRAN 语言是国际上非常流行的一种适用于数值计算的语言。MS FORTRAN 从5.0版本开始开发出了图形功能,FORTRAN语言高效的数值计算和图形功能相结合,使其具有非常广阔的应用前景。本文根据软件提供的帮助文件和参考其它有关资料[1],结合自己的实践体会,将 FORTRAN 的图形功能主要部分作介绍,供有关人员参考使用。

1 FORTRAN 图形库应用环境

  MS FORTRAN 图形库的全名为graphics.lib,它包括了一套完整的图形函数集。图开库既可以从MS FORTRAN 中调用,也可以从支持 FORTRAN 调用约定的其它MS语言中进行访问。图形库支持 IBM EGA (及兼容机)、CGA、MCGA和VGA硬件配置的某些方式和AT&T个人微机上的Olivetti视频方工,该库还支持Hercules图形卡、Graphics Card Plus、Incolor卡(及兼容卡)。

2 图形函数调用说明

  在调用图形库的函数时,都必须对该函数进行说明。MS FORTRAN提供了fgraph.fi和fgraph.fd两个文件。文件fgraph.fi中包含了interface语句段中的过程说明;文件fgraph.fd则包含了图形过程符号常量说明以及external语句,还定义了videoconfig、xycoord、wxycoord、rccoord和fontinfo五个结构。总之,这两个包含文件包括了访问所有图形函数的必需说明。因此,在调用图形函数时应在程序的开头用include语句引用这两个包含文件。

3 图形函数

  MS FORTRAN图形库函数包括外部函数和子程序两种过程。每个外部函数都有一个返回值,返回值均为整型的数。子程序在应用程序中由call调用,无返回值。在下面的介绍中,凡属子程序的都将加以注明。

3.1 显示方式

  在FORTRAN图形库中包含了许多定义文本和图形显示方式的函数,它们用来确定图形的环境特征和操作方式等。
  displaycursor(toggle)
  指定在执行每个图形函数之后显示或隐去光标。当参量toggle设置为GCURSORON值时显示光标,为GCURSOROFF值时则隐去光标。
  getvideoconfig(s)
  子程序,将当前图形环境信息返回到videomode结构参量s中,这些信息可供其它函数使用。
  setvideomode(mode)
  为特定硬件和显示器配置选择一种屏幕方式(如颜色数和分辨率)。参理mode的取值定义在fgraph.fd中,当mode取MAXRESMODE和MAXCOLORMODE 时,分别选择分辨率最高和颜色最多的图形方式,mode取DEFAULTMODE值时,将屏幕恢复为正常方式。
  settextrows(rows)
  指定文本方式所用的文本行数。
  setvideomoderows(mode,rows)
  为特定硬件和显示器组合选择一种屏幕方式。setvideomoderows、settextrows和setvideomode函数若调用成功,均返回设置的文本行数,若出错,则返回O。

3.2 图形坐标

  MS FORTRAN 图形库提供的描述屏幕象素位置的坐标系有三种,即物理坐标系、视口坐标系和窗口坐标系。所谓物理坐标系,其原点(0,0)总是位于屏幕的左上角,x轴的方向从左到右,y轴的方向从上到下,x轴和y轴的尺寸取决于配置函数和当前屏幕方式。使用图形库提供的函数,物理坐标系可以实现向视口坐标系转换,视口坐标系又可向窗口坐标系转换。
  所有使用窗口坐标的函数均以下划线和字母W结尾,即-W。凡是引用物理坐标和视口坐标的函数都是接收整型参数,而使用窗口坐标的函数则接收双精度型参数。
  setvieworg(x、y、s)
  子程序,将视口坐标原点(0,0)设置在物理坐标点(x,y)。xycoord结构变量s返回原视口原点的物理坐标值。
  setcliprgn(x1,y1,x2,y2)
  子程序,定义图形字形的矩形显示区域(称为剪裁区)。物理坐标(x1,y1)和(x2,y2)是定义该区域矩形的左上角和右下角。setcliprgn不改变当前视口坐标系。
  setviewport(x1,y1,x2,y2)
  子程序,重新设置图形视口,其定义剪裁区的方法和setcliprgn相同,视口坐标的原点设置在点(x1,y1)。
  setwindow(finvert,wx1,wy1,wx2,wy2)
  将当前视口坐标系转换为窗口坐标系。参量(wx1,wy1)和(wx2,wy2)分别指定窗口的左上角和右下角。参量finvert指定坐标的方向,当取TRUE值时,y轴方向自下向上(笛卡尔坐标);取FALSE值时,y轴方向自上向下(屏幕坐标)。若调用成功,返回非零值;若调用失败,则返回0。
  getphyscoord(x,y,s)
  子程序,将视口坐标(x,y)转换为物理坐标,并在xycoord结构s中返回物理坐标。
  getvtiewcoord(x,y,s)
  子程序,将物理坐标(x,y)转换成视口坐标,并将该坐标返回到xycoord结构s中。
  getviewcoord-w(wx,wy,s)
  子程序,将窗口坐标(wx,wy)转换为视口坐标,并将该坐标返回到wxycoord结构参量s中。
  getwindowcoord(x,y,s)
  子程序,将视口坐标(x,y)转换为窗口坐标,并在wxycoord结构s中返回窗口坐标。
  getcurrentposion(s)
  getcurentposion-w(s)
  子程序,在xycoord或wxycoord结构参量s中返回当前图形输出位置的坐标。

3.3 调色板和颜色

  屏幕上的每种颜色都是用一个相应的“颜色索引”值来表示,“调色板”即是颜色索引值和实际显示色之前的映射(关联)。大多数方式仅支持一个调色板。标准色(缺省值)有16种(0~15),参见fgraph.fd。
  remappalette(index,color)
  将一个颜色索引index重新映射到颜色值color中。若调用成功,返回原颜色值;若调用失败,则返回-1。
  selectpapette(number)
  选择调色板。本函数仅适用于视频方式MRES4 COLOR和MRESNOCOLOR。
  getbkclolor ()
  返回当前背景色的值。
  setbkcolor(color)
  将当前背景色设置为颜色索引(或颜色值)。在彩色文本方式下,setbkcolor接收一个颜色索引,如setbkcolor(2);在彩色图形文式下,setbkcolor接收一个颜色值,如setbkcolor(GREEN)。
  getcolor\-()
  返回当前前景的颜色索引。
  setcolor(color)
  设置前景色。color是一个颜色索引。
  gettextcolor
  返回当前文本色的颜色索引。
  settextcolor(index)
  为outtext函数输出的文本设置颜色。在彩色文本方式下,index值的范围可以指定为0~31。0~15是标准色,而16~31颜色同0~15,但文本将出现闪烁。

3.4 图形的显示

  MS FORTRAN 的图形库允许用指定的坐标系来画出几何图形,它们使用当前背景色、前景色、线型和填充模式。
  getlinestyle ()
  返回当前线型模式数。线型是一个16位数,其中每位对应一个象素。若位值为零,则象素保持当前背景色,若位值为1,则象素被置为当前色。缺省线型模式是#FFFF(实线)。
  setlinestyle(mask)
  子程序,设置当前线型。
  getfillmask(mask)
  子程序,返回当前填充模式。填充模式是一个8×8位的数组,每位表示一个象素。若位值为零,则象素保持不变,若位值为1,则象素被赋值为当前色。
  setfillmask(mask)
  子程序,设置当前填充模式。
  clearscreen(area)
  子程序,用于清屏。参量area取得值有:GCLEARSCREEN、GVIEWPORT、WINDOWS。
  rectangle(control,x1,y1,x2,y2)
  rectangle-w(control,wx1,wy1,wx2,wy2)
  画矩形,边界由左上角和右下角坐标定义。当参量control设置为GFILLINTERIOR值时,矩形用当前颜色和填充模式填充,为GBORDER值时则不填充。
  ellipse(control,x1,y1,x2,y2)
  ellipse-w(control,wx1,wy1,wx2,wy2)
  画椭圆。椭圆的中心是由左上角和右下角坐标定义的边界矩形的中心,大小则由矩形边界确定。control的意义见rectangle。
  polygon(control,lppoints,cpoints)
  polygon-w(control,lppoints,cpoints)
  画多边形。多边形的各个角点的坐标在xycoord或wxycoord结构数组lppoints中返回参量cpoints为多边形的角点的个数。
  lineto(x,y)
  lineto-w(wx,xy)
  从当前位置到指定点位置画一条直线。
  floodfill(x,y,boundary)
  floodfill-w(wx,wy,boundary)
  从指定坐标点开始使用当前颜色和填充模式对一个区域进行填充。参量boundary为定义区域边界线的颜色索引。
  moveto(x,y,s)
  moveto-w(wx,wy,s)
  子程序,将当前位置移动到指定点。
  getpixel(x,y)
  getpixel-w(wx,wy)
  返回一个指定点的颜色索引值。
  setpixel(x,y)
  setpixel-w(wx,xy)
  将指定点设置为当前色,相当于画点。

3.5 字形的显示

  registerfonts(filename)
 对字形文件进行“注册”,即读入指定的.fon文件,并将字形的头部信息装入内存中。参量filename是合法.fon文件的路径说明和文件名。MS FORTRAN共提供了六个.fon文件,分别保存Courier、Helv、Tms Rmn、Modern、Script和Roman六种字体的数据。本函数若调用成功,则返回注册的字形个数,若失败则返回一个负值。
  setfont(options)
  从已注册的字形集中找出一种字形作为当前字形。本函数若调用失败将返回一个负值。当前字形特征由字符型参量options指定,其选项代码有:
  t′fontname′  选择字体
  wx     字符宽度,x为象素个数
  hy     字符高度,y为象素个数
  f(或p)   仅选择一种固定(或比例)间距的字形
  v(或r)   仅选择一种向量(或光栅)映射字形
  b      自动选择最佳匹配字形
  nx     选择字形号x(单独使用)
  gefontinfo(fi)
  将当前字形特征返回到fontinfo结构fi中。本函数若调用成功则返回0。
  getgtextextent(text)
  确定字符串text以当前字形输出时的宽度。
  setgtextvector(x,y)
  子程序,指定字符串的输出方向。参量(x,y)的取值有:
  (1,0),缺省值,水平向右输出;
  (0,1),反时针旋转90度输出;
  (-1,0),反时针旋转180度输出;
  (0,-1),反时针旋转270度输出。
  outgtext(text)
  子程序,将字符串text输出到屏幕,包括尾部的空格。
  unregisterfonts
  子程序,释放由registenfonts函数分配和使用的内存空间。

3.6 文本的显示

  MS FORTRAN 图形库允许屏幕在文本方式和图形方式下可以显示文本。
  gettextposition(s)
  子程序,将当前文本位置返回到rccoord结构s中。
  settextposition(row,colummn,s)
  子程序,设置当前文本输出位置于(row,column)处,原文位置返回到rccoord结构s中。
  settextwindow(r1,c1,r2,c2)
  子程序,用行和列坐标重新定义文本输出窗口。
  outtext(text)
  子程序,将字串text以文本形式输出到屏幕,包括尾部的空格。

3.7 转换图象

  MS FORTRAN 图形库允许在内存和屏幕之间转换图象。利用这一功能可以在屏幕上绘出动画图。
  imagesize(x1,y1,x2,y2)
  imagesize-w(wx1,wy1,wx2,wy2)
  计算由边界矩形定义的图象所占内存字节数。
  getimage(x1,y1,x2,y2,image)
  getimage-w(wx1,wy1,wx2,wy2,image)
  子程序,把由指定边界矩形定义的图象保存在image指向的缓冲区中。
  putimage(x,y,image,action)
  putimage-w(wx,wy,image,action)
  子程序,将存贮在image中图象传送到屏幕。参量action取得GPSET、GPRESET、GAND、GOR、XOR值之一。

4 说明

  (1)在编制图形应用程序时,开始可调用getvideoconfig检查系统的当前视频配置,以选择设置一种最合适的屏幕方式。而在退出应用程序前,应将屏幕设置为正常方式,以避免其它程序设置屏幕方式时产生潜在冲突。
  (2)MS FORTRAN 的图形库设置了三种图形坐标系。对于大多数应用程序(如气象资料的统计分析)而言,使用窗口坐标系,可以很方便地对数据进行比例变换,以便适应于屏幕的大小,直到取得满意、直观的图形效果。
  (3)许多图形函数如setivdeomode等,仅能在某种硬件或某种图形方式下有效,若使用非法硬件环境,则返回一错误代码。因此在调用时应注意检查返回值。

ip地址已设置保密
2005/12/28 22:14:30
zj79
帅哥哟,离线,有人找我吗?
等级:论坛游民
文章:50
积分:566
门派:无门无派
注册:2005年12月28日
7
 用支付宝给zj79付款或购买其商品,支付宝交易免手续费、安全、快捷! 点击这里发送电子邮件给zj79

发贴心情
Visual Fortran 高级编程技术

       Microsof 公司推出了支持32位的FORTRAN   POWER  STATION1.0 到FORTRAN  POWER  STATION4.0编译器后将其卖给了DEC公司。DEC随即推出了DVF5.0(Digital Visual FORTRAN 5.0),其工作环境与MFC5.0完全一致,最近DEC又推出了DVF6.0(Digital Visual FORTRAN 6.0,其工作环境与MFC6.0完全一致。

   FORTRAN在DOS下的编程技术相信早以为大家熟悉。有关FORTRAN90方面的书籍也不少见,因此这里不再赘述。以下主要以最新的DVF5.0讲述有关FORTRAN图形编程的方法。

1 DVF 概述
2 QuickWin Application
3 Win32 Application
4 OpenGL
1 DVF概述
1. 1 安装
1) 在安装选项中,注意选择 /Samples,这里包含了DVF的丰富例子。
2) 要拷贝 /Msdn 子目录,这里包含了API及OPENGL函数的帮助。
3) 可以网上下载升级。
1.2 语言
1) 书写格式
● 不受列的限制,可自由书写。
● 注释在任何地方由'!'开始。
● 续行在行尾加'&'。
2) 动态数组
● 优点:动态数组的维界在程序执行过程中随时可按需要变化,数据需要占多少内存,就可在程序中动态地分配给数组多少内存;如果该数组以后不再使用,又可释放该数组,把该数组占用的内存归还给系统另作他用。这样可以节约使用内存,提高内存使用效率。动态数组主程序与子程序。
● 语句:
? 属性说明语句
ALLOCATABLE
? 分配语句
ALLOCATE(数组名1(形状描述),数组名2(形状描述),…[STAT=变量 名])
? 释放语句
DEALLOCATE(动态数组名1,动态数组名2,…[STAT=变量名])
● 例子程序1
REAL(8),ALLOCATABLE::X(:),Y(:),Z(:)
INTEGER(4)::NODE
READ(*,*) NODE
ALLOCATE (X(1:NODE),Y(1:NODE),Z(1:NODE))
DO I=1,NODE
X(I)=1.0
Y(I)=1.0
Z(I)=I
END DO
DO I=1,NODE
WRITE(*,*) X(I),Y(I),Z(I)
END DO
DEALLOCATE(X,Y,Z)
END
3) 模块
● 优点:模块是一种在主程序单元之外独立编写的程序单元。模块程序单元内没有可执行语句,除了说明语句外,最多包含模块过程。主要作用是供其他程序单元引用,即数据的共享与模块过程的复制。包含了COMMON与INCLUDE的全部功能。
● 语句:
a 模块的编写
MODULE 模块名
类型说明部分
[CONTAINS]
[模块过程1]
… [模块过程N]
END MODULE [模块名]
b 模块的引用
USE 模块1,模块2,…,模块n
● 例子程序2:
! 模块***************************************
MODULE MYDATA
INTEGER NODE,NEL
END MODULE MYDATA
!*******************************************
!主程序*************************************
USE MYDATA
NODE=100
NEL=90
WRITE(*,*)"IN MAIN PROGRAM :"
WRITE(*,*)"NODE=",NODE
WRITE(*,*)"NEL=",NEL
CALL SUBPROGRAM()
END
!*******************************************
!子程序*************************************
SUBROUTINE SUBPROGRAM()
USE MYDATA
WRITE(*,*)"IN SUBPROGRAM :"
WRITE(*,*)"NODE=",NODE
WRITE(*,*)"NEL=",NEL
END SUBROUTINE
!*******************************************
1.2 开发环境
1) 建立新文件、新项目
● "File" → "New" → "Files"
文件类型:
a 固定格式
b 自由格式
● "File" → "New" → "Projects"
项目类型:
a Win32 Console Application:
基于命令行的程序(字符界面)。
b Standard Graphics Application:
单窗口单任务绘图应用程序,易学易用。
c Quick Win Application
多窗口单任务绘图应用程序,易学易用。
d Win32 Application
多窗口多任务应用程序,有固定的程序结构,复杂难学。
2) 建立资源文件
● "Insert" → "Resource"
资源文件类型:
a 加速键
b 对话框
c 图象
d 菜单
2 Quick Win Application
2.1 画图
1) 例子程序3
SUBROUTINE PLOT_JU()
USE DFLIB
TYPE (XYCOORD) POS
OPEN(8,FILE='USER',TITLE='矩形')
I=SETBKCOLOR(3)
CALL CLEARSCREEN($GCLEARSCREEN)
I=SETCOLORRGB(#FFFFFF)
I=RECTANGLE($GFILLINTERIOR,100,100,300,300)
END
2) 注意点:
● 必需包含DFLIB库。
● 子窗口用 OPEN(窗口号,FILE='USER') 打开。
● 用QuickWin编写的绘图程序不能被Win32 Application引用。
2.2 菜单
1) 编辑菜单
2) 菜单的应用
例子程序4
LOGICAL(4) FUNCTION INITIALSETTINGS()
USE DFLIB
LOGICAL(4) RESULT
EXTERNAL PLOT_TYPE
RESULT=APPENDMENUQQ(1,$MENUENABLED,'画图(&P)'C,PLOT_TYPE)
INITIALSETTINGS=.TRUE.
END FUNCTION INITIALSETTINGS
2.3 对话框
1) 编辑对话框
2) 对话框的应用
例子程序5
SUBROUTINE PLOT_TYPE(L)
USE DIALOGM
IMPLICIT NONE
INCLUDE 'RESOURCE.FD'
LOGICAL RET,L
TYPE(DIALOG)DLG
EXTERNAL PLOT
RET=DLGINIT(IDD_PLOT_TYPE,DLG)
RET=DLGSET(DLG,IDC_PLOT_S1,'图形类型:')
RET=DLGSET(DLG,IDC_PLOT_L1,2,DLG_NUMITEMS)
RET=DLGSET(DLG,IDC_PLOT_L1,'矩形'C,1)
RET=DLGSET(DLG,IDC_PLOT_L1,'圆'C,2)
RET=DLGSETSUB(DLG,IDOK,PLOT)
RET=DLGMODAL(DLG)
CALL DLGUNINIT(DLG)
RETURN
END SUBROUTINE
SUBROUTINE PLOT(DLG,CONTROL_NAME,CALLBACKTYPE )
USE DFLOGM
INCLUDE 'RESOURCE.FD'
TYPE (DIALOG) DLG
INTEGER CONTROL_NAME,CALLBACKTYPE,LOCAL_CALLBACKTYPE
INTEGER VALUE
LOGICAL RET
LOCAL_CALLBACKTYPE = CALLBACKTYPE
RET=DLGGET(DLG,IDC_PLOT_L1,VALUE,1)
SELECT CASE (VALUE)
CASE(1)
    CALL PLOT_JU()
CASE(2)
    CALL PLOT_YUAN()
    CASE DEFAULT
END SELECT
CALL DLGEXIT(DLG)
END SUBROUTINE
3 Win32 Application
3.1 概念
1) 窗口
是Windows应用程序基本的操作单元,是应用程序与用户之间交互的接口环境,也是系统管理应用程序的基本单位。
2) 事件驱动
Windows程序设计围绕事件或消息的产生驱动运行处理函数。
3) 消息
Windows应用程序通过发送和接收统一格式的消息与其他应用程序和Windows系统进行信息交换。
4) 对象与句柄
Windows系统通过句柄标识不同的对象和同类对象中不同的实例。
3.2 程序结构
1) WinMain函数
● WinMain函数是应用程序的入口函数,其功能是完成一系列的定义和初始 化工作,并产生消息循环。
● 例子程序6
2) 窗口函数
● 定义了应用程序对接收到的不同消息的响应,是消息处理分支控制语句的 集合。
● 例子程序7
3.3 菜单
例子程序8
3.4 对话框
例子程序9
INTEGER*4 FUNCTION FILE_INPUT(HWND, MESSAGE, WPARAM, LPARAM)
!DEC$ IF DEFINED(_X86_)
!DEC$ ATTRIBUTES STDCALL, ALIAS : '_FILE_INPUT@16' ::FILE_INPUT
!DEC$ ELSE
!DEC$ ATTRIBUTES STDCALL, ALIAS : 'FILE_INPUT' ::FILE_INPUT
!DEC$ ENDIF
USE DFWINA
USE MYDATA
INTEGER*4 HWND, MESSAGE, WPARAM, LPARAM,H
LOGICAL BRET
CHARACTER*30 STR
    SELECT CASE (MESSAGE)
CASE (WM_INITDIALOG)
STR='对话框实例'
    H=GETDLGITEM(HWND,1201)
                    I=SENDMESSAGE(H,CB_ADDSTRING ,0,LOC(STR(1:10)))
        RETURN
CASE (WM_COMMAND)
SELECT CASE (LOWORD(WPARAM))
CASE (IDCANCEL)
I = ENDDIALOG (HWND, 1)
            FILE_INPUT=TRUE
RETURN
CASE (IDOK)
                I = ENDDIALOG (HWND, 1)
            FILE_INPUT=TRUE
RETURN
        END SELECT            
END SELECT
FILE_INPUT= FALSE
RETURN
END
3.5 GDI绘图
例子程序10
SUBROUTINE PLOT(HDC)
USE DFWINA
USE MYDATA
USE DFWIN
INTEGER HDC,HFONT
LOGICAL BRET
ID_PLOT=1
IF (PLOT_TYPE==1) THEN
BRET= SELECTOBJECT(HDC, HPEN(1))
BRET=ARC(HDC,300,200,700,600,300,200,300,200)
BRET=SETTEXTCOLOR(HDC,RGB(0,0,0))
BRET=SETBKCOLOR(HDC,RGB(255,255,255))
H=65
LINE_W=50
CALL FONT(H,LINE_W,HFONT)
BRET=SELECTOBJECT(HDC,HFONT)
BRET=TEXTOUT(HDC,320,400,'GDI画图例子1',12)
BRET=DELETEOBJECT(HFONT)
ELSE
BRET= SELECTOBJECT(HDC, HPEN(2))
BRET=ARC(HDC,300,200,700,600,300,200,300,200)
BRET=SETTEXTCOLOR(HDC,RGB(255,100,0))
BRET=SETBKCOLOR(HDC,RGB(255,255,255))
H=65
LINE_W=50
CALL FONT(H,LINE_W,HFONT)
BRET=SELECTOBJECT(HDC,HFONT)
BRET=TEXTOUT(HDC,320,400,'GDI画图例子2',12)
BRET=DELETEOBJECT(HFONT)
END IF
END SUBROUTINE
  
SUBROUTINE FONT(H,LINE_W,HFONT)
USE DFWINA
INTEGER HFONT
HFONT=CREATEFONT(H,0,0,0,LINE_W,0,0,0,ANSI_CHARSET, &
OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY, &
DEFAULT_PITCHIFF_DONTCARE,"大号字")
END
SUBROUTINE PEN()
USE DFWINA
    USE MYDATA
    HPEN(1)=CREATEPEN(PS_SOLID,7,RGB(255,0,0))
    HPEN(2)=CREATEPEN(PS_SOLOD,7,RGB(0,255,0))
  
END
3.6 未解决的问题
● 工具栏的使用。
4 三维计算机图形库OpenGL
4.1 概述
1) Quick Win、GDI、OpenGL 比较
Quick Win    GDI    OpenGL
类型    平面    平面    三维
速度    慢    慢    快
程度    简单    较复杂    复杂
2) 注意点
● QuickWin Application和 Win32 Application都能用OpenGL绘图。
● 要连接 opengl32.lib glu32.lib glaux.lib 。
3) 编写OpenGL程序的基本步骤
建模→设置视点→设置光照→绘制场景→屏幕窗口
4.2 OpenGL 实现的功能
● 基本几何要素。
例子程序11
………………………….
………………………….
integer ret
CALL READDATA()
call fauxinitdisplaymode(IOR(IOR(AUX_SINGLE,AUX_INDEX),AUX_DEPTH))
call fauxinitposition(0,0,700,700)
ret=fauxinitwindow("曲面"c)
call myinit()
call fauxreshapefunc(LOC(myreshape))
call fauxmainloop(loc(display))
end
!**************************************************
subroutine myreshape(w,h)!重新计算 模型,取景变换,投影变换
!DEC$ IF DEFINED(_X86_)
!DEC$ ATTRIBUTES STDCALL, ALIAS : '_myReshape@8' :: myReshape
!DEC$ ELSE
!DEC$ ATTRIBUTES STDCALL, ALIAS : 'myReshape' :: myReshape
!DEC$ ENDIF
use dfopngl
use mydata
integer(4) w,h
call fglViewPort(0, 0, W,H)
call fglmatrixmode(GL_PROJECTION)
call fglloadidentity()
    callfgluperspective(BIAO_APH+10.,DBLE(w)/DBLE(h),BIAO_S- BIAO_R*1.01,BIAO_S+BIAO_R)
call fglmatrixmode(GL_MODELVIEW)
call fglloadidentity()
    CALL FGLTRANSLATEF(X_EYE,Y_EYE,Z_EYE)
end subroutine
!************************************************
subroutine myinit()!明暗处理方式
!DEC$ IF DEFINED(_X86_)
!DEC$ ATTRIBUTES STDCALL, ALIAS : '_myinit@0' :: myinit
!DEC$ ELSE
!DEC$ ATTRIBUTES STDCALL, ALIAS : 'myinit' :: myinit
!DEC$ ENDIF
use dfopngl
use mydata
A=252./255.
B=22./255.
C=16./255.
CALL FAUXSETONECOLOR(30,A,B,C)
…………………
CALL FAUXSETONECOLOR(59,A,B,C)
CALL FGLCLEARINDEX(REAL(29))
CALL FGLSHADEMODEL(GL_SMOOTH)
call fgldepthfunc(GL_LEQUAL)
call fglenable(GL_DEPTH_TEST)
CALL FGLDISABLE(GL_DITHER)
end subroutine
!************************************************
subroutine display()
!DEC$ IF DEFINED(_X86_)
!DEC$ ATTRIBUTES STDCALL, ALIAS : '_display@0' :: display
!DEC$ ELSE
!DEC$ ATTRIBUTES STDCALL, ALIAS : 'display' :: display
!DEC$ ENDIF
use dfopngl
use mydata
external drawmyobjects
call fglclear(GL_COLOR_BUFFER_BIT)!清除视见区的缓冲区
call fglclear(GL_DEPTH_BUFFER_BIT)
call fglRotatef(-55, 1.0, 0.0, 0.0)
call fglRotatef(-45, 0.0, 0.0, 1.0)
call drawmyobjects()
CALL FGLEND()
end subroutine
!**************************************************
subroutine drawmyobjects()
use dfopngl
use mydata
DO I=1,NODE
call fglbegin(GL_POLYGON)
CALL FGLINDEXI(59-(Z_NODE(1,I)+400)/30.-2)
    call fglvertex3f(x_NODE(1,I),y_NODE(1,I),z_NODE(1,I))
CALL FGLINDEXI(59-(Z_NODE(2,I)+400)/30.-2)
    call fglvertex3f(x_NODE(2,I),y_NODE(2,I),z_NODE(2,I))
CALL FGLINDEXI(59-(Z_NODE(3,I)+400)/30.-2)
    call fglvertex3f(x_NODE(3,I),y_NODE(3,I),z_NODE(3,I))
CALL FGLINDEXI(59-(Z_NODE(4,I)+400)/30.-2)
    call fglvertex3f(x_NODE(4,I),y_NODE(4,I),z_NODE(4,I))
call fglend()
END DO
end subroutine
● 材质、光照处理。
例子程序12
………………………
………………………
real(4):: ambient(4)
real(4):: diffuse(4)
real(4):: position(4)
real(4):: mat_ambient1(4)
real(4):: mat_diffuse1(4)
REAL(4)::SPOT_DIR(3)
data ambient/0.0,0.0,0.0,1.0/
data diffuse/1.0,1.0,1.0,1.0/
data position/-30.,30.0,30.,1.0/
data mat_ambient1/0.0,0.5,1.0,1.0/
data mat_diffuse1/0.0,0.5,1.0,1.0/
DATA SPOT_DIR/1.0,-1.0,-1.0/
call fglenable(GL_DEPTH_TEST)
call fgldepthfunc(GL_LESS)
call fgllightfv(GL_LIGHT0,GL_AMBIENT,loc(ambient))
call fgllightfv(GL_LIGHT0,GL_DIFFUSE,loc(diffuse))
call fgllightfv(GL_LIGHT0,GL_POSITION,loc(position))
CALL FGLLIGHTF(GL_LIGHT0,GL_SPOT_CUTOFF,APHADD)
CALL FGLLIGHTFV(GL_LIGHT0,GL_SPOT_DIRECTION,LOC(SPOT_DIR))
call fglenable(GL_LIGHTING)
call fglenable(GL_LIGHT0)
call fglmaterialfv(GL_FRONT,GL_AMBIENT,loc(mat_AMBIENT1))
call fglmaterialfv(GL_FRONT,GL_DIFFUSE,loc(mat_diffuse1))
……………………..
…………………….
● 混合、反走样。
● 纹理。
…………………………………..
…………………………………..
CALL FGLTEXIMAGE2D(GL_TEXTURE_2D,0,3,4,4,&
0,GL_RGB,GL_UNSIGNED_BYTE,LOC(CHE))
CALL FGLTEXPARAMETERF(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT)
CALL FGLTEXPARAMETERF(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT)
CALL FGLTEXPARAMETERF(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_linear)
CALL FGLTEXPARAMETERF(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_linear)
CALL FGLTEXENVF(GL_TEYTURE_ENV,GL_TEXTURE_ENV_MODE,GL_DECAL)
CALL FGLENABLE(GL_TEXTURE_2D)
…………………………..
…………………………..
CALL FGLTEXCOORD2F(0.0,0.0);CALL FGLVERTEX2F(-2.0,-1.0)
CALL FGLTEXCOORD2F(0.0,2.);CALL FGLVERTEX2F(-2.0,1.0)
CALL FGLTEXCOORD2F(2.,2.);CALL FGLVERTEX2F(0.0,1.0)
CALL FGLTEXCOORD2F(2.,0.0);CALL FGLVERTEX2F(0.0,-1.0)
…………………………..
……………………………..
● 选择与反馈。
4.3 未解决的问题
● 图形的打印。
● 写汉字。

ip地址已设置保密
2005/12/28 22:14:47
zj79
帅哥哟,离线,有人找我吗?
等级:论坛游民
文章:50
积分:566
门派:无门无派
注册:2005年12月28日
8
 用支付宝给zj79付款或购买其商品,支付宝交易免手续费、安全、快捷! 点击这里发送电子邮件给zj79

发贴心情
怎样在 VC 程序中调用 Fortran 程序?

    关于在 VC 中调用 FORTRAN 的问题,有以下两点供参考:
一 、VC调用 FORTRAN 的方式
    为便于编译和调试程序(尤其在 VC 和 FORTRAN 使用不同公司的编译器时),对于多语言编程的应用程序,通常以 DLL 来实现相互间的调用。可以把被调用的 FORTRAN 过程做到 DLL 中,并保证 C 与所调用的 FORTRAN 函数都具有相同的接口。
    调用应采用动态加载(显式链接)方式。使用动态加载的应用程序必须使用 LoadLibrary() 函数加载 DLL 并得到一个模块句柄。然后使用该句柄调用  GetProcAddress() 函数获得所需调用的导出函数的指针,并通过该指针调用 DLL 中的导出函数。在使用完毕之后,还需调用 FreeLibrary() 函数释放加载的 DLL 。
二、要注意的问题:
    为使调用过程正确,在主程序中应注明被调用过程的属性为“ C”属性(extern "C")。同样,FORTRAN 过程的参数也都必须以 INTERFACE 语句指定各变元为“ C”属性(var_name [C])。
    指定子过程和变元属性非常重要,因为 C 与 FORTRN 调用子过程时的参数入栈次序正好相反,指定相同的属性可保证调用时参数正确传递。此外,由于 C 通过传值方式传递参数,FORTRAN 则通过传址方式传递参数,对于大数据量的参数(如数组、结构变量)等,还需指定变量遗传址方式传递,以减小系统开销。

擅自网站:问专家

ip地址已设置保密
2005/12/28 22:15:01
zj79
帅哥哟,离线,有人找我吗?
等级:论坛游民
文章:50
积分:566
门派:无门无派
注册:2005年12月28日
9
 用支付宝给zj79付款或购买其商品,支付宝交易免手续费、安全、快捷! 点击这里发送电子邮件给zj79

发贴心情
怎样在 VB 程序中调用 Fortran 程序?

摘要:本文介绍了如何通过DLL实现VB5.0和Fortran PowerStation4.0的接口。该方法为编制Windows95下的数值计算事件驱动程序提供了一条方便的途径。 关键词:动态链接 函数 子程序 声明

    1 引言

    众所周知,Fortran语言自从50年代问世以来,一直是数值计算领域所使用的主要语言,以往大量的科学与工程计算程序都是在DOS下用Fortran语言编写的。Microsoft公司推出的Windows95和WindowsNT下的32位的Fortran PowerStation4.0(以下简称FPS4.0)是一种功能强大的Fortran集成开发环境。它几乎完全兼容Fortran90和Fortran77标准,并提供了与当今流行的Windows95的接口。利用FPS4.0和Windows其他编程工具(如VisualC++和VisualBasic等)能很容易开发出Windows95下的Windows事件驱动程序。在Windows的诸多编程工具中,VisualBasic以其简单易学、功能强大等优点而广受非计算机专业人员欢迎。经过一段时间的探索,笔者成功地把FPS4.0和VisualBasic5.0(以下简称VB)通过DLL技术结合起来,编制出Windows95下的Windows事件驱动程序。这样使得应用程序既具有Windows环境图形用户界面的友好性,又能充分利用Fortran原有的丰富资源(如大量先前开发的DOS下的科学与工程计算程序等)。

    本文的基本思路是用VB设计用户界面及控制程序,而将计算用Fortran程序通过FPS4.0编译成DLL,并由VB调用。它们之间的数据交换通过参数传递来实现。

    2 用FPS4.0创建DLL

    DLL(动态链接库)是可被其他程序或DLL调用的函数(过程)集合组成的可执行文件模块。Windows本身提供了大量的应用程序接口(API)函数,都是通过DLL机制来实现的。DLL之所以在Windows中被广泛应用,是因为它除了具有静态链接库的功能外,尚有如多个应用程序共享一个DLL以节省内存和磁盘空间等许多优点。

    在FPS4.0中,可根据需要将一组Fortran函数或子程序放在一个程序中,创建成一个DLL,它本身不能运行,只能被VB调用。

    具体实现步骤如下:先建立一个New Project Workspace,定义其类型为DynamicLinkLibrary,然后将一个只含有函数或子程序的Fortran程序加入到Project中,编译通过即可生成DLL。在Fortran程序中,必须被调用的函数或子程序予以声明,以标识这些函数或子程序在所生成的DLL中是可用的。具体语法如下:

    $ATTRIBUTES DLLEXPORT ∷Name

    $ATTRIBUTES是FPS4.0中的元命令(metacommand),用于声明微软扩展属性(Microsofttextendedattributes)。DLLEXPORT是上述属性之一,它的作用就是声明该函数或子程序能被其他程序或DLL调用。Name为函数或子程序名。该语句应放在程序的变量声明处。

    3 VB调用Fortran DLL

    VB在调用DLL前,必须先在模块级或相应Form中的GeneralDeclaration中,对被调用的DLL进行声明,语法如下:

[Public][Private] Declare sub Name lib "libname" [Alias"aliasname"] [(arglist)][Public][Private] Declare Function Name lib "libname" [Alias"aliasname"] [(arglist)]

    Declare语句的作用是声明对DLL中外部过程的引用。至于语句中各组成部分的意义,一般的VB书籍都有介绍,在此不再赘述。声明之后,VB中使用Call语句实现调用DLL中的函数或子程序,调用语句如下:Call Name(arglist)Name的意义同上。以上仅是VB中调用DLL的一般语法,下文对声明和调用过程中应注意的两点进行讨论。

    3.1 声明语句中对于Alias部分的处理

    一般Alias关键字指定函数或子程序的别名,这是因为有些DLL中的函数或子程序名称太长或名称上加有VB不能识别的不合法符号,或有些函数或子程序名与VB中的关键字重名,那么这时应将DLL库中真实的函数或子程序名写在别处。

    但在FPS4.0生成的DLL中,每一个声明的函数或子程序均有一个别名,都需用Alias关键字进行声明。该别名在编译生成的库文件(.LIB)中可以找到。经过笔者反复调试,发现它的命名有一定的规律可循,即如果函数或子程序名为name1,则别名为_name1@x,其中x为一整数,x等于函数或子程序的参数个数乘以4。特别要注意,若函数或子程序的参数个数为0那么x也为0。具体的实现可见下文实例。

    3.2 调用过程中的参数传递

    要使VB正确地调用FortranDLL,另一个值得注意的问题是调用过程中的参数传递。由于FPS4.0和VB在数据定义类型上的不一致,因此在VB的Declare语句中的参数列表中,必须将Fortran程序的参数类型正确地对应到VB中。两种系统的参数对应关系见表1。

表1 FPS4.0和VB主要参数传递对照表

FPS4.0 INTEGER INTEGER(2) REAL*4 REAL*8

VB LONG INTEGER SINGLE DOUBLE

    另外,如果所传递的参数是数组类型,则在VB的Declare语句中应把数组的第一个元素作为参数放在参数列表的对应位置。

    4 VB调用FPS4.0 DLL实例

    为了具体说明上述过程的细节,本文列举了一个功能简单的程序如下:EXAM.F是一个含有子程序ARRAYTEST的Fortran程序。子程序ARRAYTEST(arr,n)的功能是改变两个参数的值并返回。

程序代码如下:

SUBROUTINE ARRAYTEST(n,arr)

$ATTRIBUTES DLLEXPORT :: ARRAYTEST

INTEGER n,i,j

REAL(4) arr(3,3)

DO i=1,3

DO j=1,3

arr(i,j)=10.1*i+j

END DO

END DO

n=n+10

END SUBROUTINE

    编译后产生EXAM.DLL文件。由于子程序ARRAYTEST只有两个参数,故它的别名为_ARRAYTEST@8。EXAM.VBP是一个VB程序,它包含一个窗体FORM1.FRM;一个命令按钮Command1和两个文本框Text1、Text2。两个文本框的作用是为了显示返回的结果,以检验程序是否正确执行。FORM1.FRM代码如下:

Private Declare Sub ARRAYTEST Lib "EXAM.dll" Alias "_ARRAYTEST@8" (XAS LONG,Y AS SINGLE)

Private Sub Command1_Click()

Dim a As Long

Dim ab(1 To 3, 1 To 3) As Single

a=10

Call ARRAYTEST(a,ab(1,1))

Text1.Text=Str(a)

Text2.Text=Str(ab(3,3))

End Sub

    运行后Text1.Text为20,Text2.Text为33.3,结果正确。

    5 结束语

    本文探讨了Windows95下VB和FPS4.0通过DLL实现联合编程的方法。利用VB的可视化开发环境和FPS4.0可以使Fortran应用程序具有直观、操作方便的图形界面,文中所述方法为广大DOS下Fortran用户升级应用程序提供了一条简便、快捷的途径。

殷国锋 周志芳 (河海大学土木工程学院 南京 100098)

ip地址已设置保密
2005/12/28 22:15:11

 9   9   1/1页      1    
网上贸易 创造奇迹! 阿里巴巴 Alibaba
Powered By Dvbbs Version 7.1.0 Sp1
Copyright ©2005 - 2008 www.fortran.cn
页面执行时间 0.07031 秒, 3 次数据查询
京ICP备05056801号