上节课已经详细介绍了在Compaq Visual fortran 6.6环境下,怎么在控制台程序中利用CChart绘制曲线,本节课继续这个话题,只是绘制的图像改成了等高线云图。
在本系列教程中,很多时候都把曲线图和等高线图分开讲解,这是因为等高线图要用到函数指针,而不同语言对于函数指针的处理方式很不相同,所以等高线图的绘制需要专门讲解。
Fortran语言也支持函数指针,但比较绕,笨笨尝试了很久才成功。
下面开始。
第一步,重复上一节课的第一到第四步,建立一个名为LessonA35的Fortran控制台程序。
第二步,导入需要用到的几个函数。
本节课需要导入的函数有CreatePopupChartWndGlobal,SetType,SetFieldFcn,SetPlotRange,SetTitle,ReDraw和SimpleMsgLoop。
这些函数中,大多上节课已经处理了,这里不赘述。
新增的是SetType,SetFieldFcn和SetPlotRange,其中SetFieldFcn用到了函数指针,这里专门解释一下,另外两个函数的导入方式和上节课一样。
CChart提供了两个SetFieldFcn函数。
void SetFieldFcn(double (*_pFieldFcn) (double, double));
void SetFieldFcn(double (_stdcall *_pFieldFcn) (double, double));
这两个函数的区别在于设置的场函数调用约定不同,第一个是cdecl约定,第二个是stdcall约定。根据Fortran的实际情况,我们需要导入的是第二个。这样,我们可以从CChart_EXPORTS.txt文件里面查找到SetFieldFcn的复杂名字。
下面给出导入的代码。
subroutine SetFieldFcn(fieldFcn)
interface
double precision function fieldFcn(x, y)
!DEC$ATTRIBUTES VALUE::x,y
double precision x, y
end function fieldFcn
end interface
!DEC$ATTRIBUTES DLLIMPORT,ALIAS:'?SetFieldFcn@Classless@@YAXP6GNNN@Z@Z'::SetFieldFcn
end subroutine SetFieldFcn
从这里可以看出,要在Fortran里面用函数名作为形参,需要采用interface界面定义的方式。在interface里面,同样用!DEC$ATTRIBUTES VALUE::x,y把场函数的形参设置为传值。
第三步,建立我们的场函数。
double precision function MyFieldFcn(x, y)
!DEC$ATTRIBUTES VALUE::x, y
double precision x, y
MyFieldFcn = 1.0/(x*x+y*y+1.0)
return
end function MyFieldFcn
同样要注意这里的传值设置。
第四步,在主程序的变量定义区域,增加一个场函数的声明。
double precision, external :: MyFieldFcn
第五步,在print *, 'Hello World'这一行的下面,增加下列代码。
print *, "创建弹出窗口..."
call CreatePopupChartWndGlobal(0, 0, LOC("窗口标题"C), 50, 50, 600, 450)
print *, "设置绘图类型..."
call SetType(6)
print *, "设置标题"
call SetTitle(LOC("Fortran等高线云图"C))
print *, "设置场函数..."
call SetFieldFcn(MyFieldFcn)
print *, "设置绘图数据范围"
call SetPlotRange(-3.0, 3.0, -2.0, 2.0)
print *, "重绘..."
call ReDraw()
print *, "建立消息循环..."
call SimpleMsgLoop()
同样的,这些代码已经不需要解释了。
结果如图。
Fortran控制台程序的应用讲解到此结束,下节课将讲解Fortran窗口程序中用CChart绘图。