background image

引用或指针的方式进行了,不会再产生新有效的实例了,对于由小组编程的项目软件,而
你又恰好负责编程控制卡这一块的话,以上的显性报警,会让其它人心领神会。当然,你也
可以将上面的方法加入到

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 //最多轴数