我们所写的程序皆是属于高阶的语言,是无法直接执行的,想要执行所编写的程序则必须经过编译过程,将所写的高级语言转化为低阶的机械语言,这样的语言计算机才认得,也才有办法加以执行,至于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
A. Fortran 最常犯的错误是变量使用的错误,比如说某变量 aa 在宣告时 位整数,而在程序中物当作实数使用。 B. 某变量在程序中使用了,但是却忘了宣告。 C. 程序写的太长超过了72行的限制或是连结的两行忘了在第六行加上连结的符号。 D. 在复杂的程序中刮号的错误。 E. 在循环控制中,因变量的不当控制而导致的无限循环。 F. 在循环控制中,因不慎在不同的回圈中使用了相同的地址。 G. 两个选择性控制或两个循环性控制产生了交集。 H. 在一个循环性回圈中包含有另一个回圈时,两个回圈不慎使用了相同的控制变量。 I. 程序中不慎产生了奇异值(某数除以零)或产生不收敛值而爆掉的情况。 J. 使用子程序时,主程序与子程序相对的变量有不同的宣告值。 K. 变量的长度过长。 L. 不完整的回圈结构,比如说在 if 的结构中漏掉了 then 或 endif 。 M. 将整数当实数处理而产生的数值上的错误,比如说变量 a 和 b 宣告为整数,则 a 除以 b时的商取整数部份,小数部份则略去而产生错误。 N. 输出或输入的格式码错误。
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。
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中返回当前图形输出位置的坐标。
屏幕上的每种颜色都是用一个相应的“颜色索引”值来表示,“调色板”即是颜色索引值和实际显示色之前的映射(关联)。大多数方式仅支持一个调色板。标准色(缺省值)有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,但文本将出现闪烁。
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)
将指定点设置为当前色,相当于画点。
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函数分配和使用的内存空间。
MS FORTRAN 图形库允许屏幕在文本方式和图形方式下可以显示文本。
gettextposition(s)
子程序,将当前文本位置返回到rccoord结构s中。
settextposition(row,colummn,s)
子程序,设置当前文本输出位置于(row,column)处,原文位置返回到rccoord结构s中。
settextwindow(r1,c1,r2,c2)
子程序,用行和列坐标重新定义文本输出窗口。
outtext(text)
子程序,将字串text以文本形式输出到屏幕,包括尾部的空格。
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值之一。
(1)在编制图形应用程序时,开始可调用getvideoconfig检查系统的当前视频配置,以选择设置一种最合适的屏幕方式。而在退出应用程序前,应将屏幕设置为正常方式,以避免其它程序设置屏幕方式时产生潜在冲突。
(2)MS FORTRAN 的图形库设置了三种图形坐标系。对于大多数应用程序(如气象资料的统计分析)而言,使用窗口坐标系,可以很方便地对数据进行比例变换,以便适应于屏幕的大小,直到取得满意、直观的图形效果。
(3)许多图形函数如setivdeomode等,仅能在某种硬件或某种图形方式下有效,若使用非法硬件环境,则返回一错误代码。因此在调用时应注意检查返回值。