深入浅出CChart 每日一课——快乐高四第三十五课 砥砺前行,Fortran控制台绘制等高线云图

上节课已经详细介绍了在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绘图。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值