引用或指针的方式进行了,不会再产生新有效的实例了,对于由小组编程的项目软件,而
你又恰好负责编程控制卡这一块的话,以上的显性报警,会让其它人心领神会。当然,你也
可以将上面的方法加入到
InitBoard 当中去,可以避你的无意识的多次调用了。
附:无意识的多次调用经常发生,特别是那些对
MFC 机制不明确的程序员,在多文档框架
下,不知道这个
CctrlCard::InitBoard 函数到底是应该放在 CmainFrame 的 OnCreate 里面,
还是应该放在
CchildFrame 的 OnCreate,或者是 Cview 的 OnInitUpdate 里面进行调用。
在一言难尽
MFC 的情况下,我建议两个小方法:
No.1 将 CctrlCard 的函数置于 Cmainframe 的 OnCreate 或者 Capp::Initstance 内调用
No.2 将 InitBoard 函数稍加改造成这样:
Int CctrlCard::InitBoard()
{
static int n(-1000);//注意,-1000 是控制卡函数不可能返回的值
if( n == -1000 )
n = d1000_board_init();
return n;//这样,即使多次调用也不样怕了,呵呵,雕虫小技也可以除虫啊
}
必须额外声明一下,我们不是不重视资源的释放,而是作为一个
C++程序员写下这些代码
是基本的义务(这也是我为什么要交待读者必须要有一定的
C++基础):
class CctrlCard
{
public:
~CctrlCard()
{//定义析构函数,在此释放资源,对此,我不想再转到读者的眼球了
d1000_board_close();
}
}
二、
数据结构及数据类型的定义,部分相关声明
调用控制卡驱动函数时,经常会有如下形式:
单轴相对运动
d1000_start_t_move( axis, pulse, start, speed, accel );
单轴绝对运动
d1000_start_ta_move( axis, pulse, start, speed, accel );
两轴相对插补
d1000_start_t_line( axisArray, distArray, start, speed, accel );
两轴绝对插补
d1000_start_ta_line( axisArray, distArray, start, speed, accel );
圆弧相对插补
d3000_start_t_arc( axisArray, C1, C2, E1,E2, dir, start, speed, accel );
圆弧绝对插补
d3000_start_ta_arc( axisArray, C1, C2, E1,E2, dir, start, speed, accel );
以上的调用,很多重复枯燥,又不直观,难于理解,并且在面向客户时,常常是指每分多
少米,或者每秒多少毫米,很少有人问每秒多少脉冲,移动多少脉冲作距离,故需要单位
之间的换算。显然,对于这些问题,我想,C++程序员应该找到用武之地了,所以我们一
步一步来,慢慢统一各个问题。实质上,在以下的几个技巧,也需要在此澄清一些概念。
我们先来几个宏定义提高一下情绪:
# define MAX_AXIS 4 //最多轴数