background image

情况并不那么美好。通常情况下,

PC 机内只插同种类型的控制卡 1 到 2 张,在通过调用

d1000_board_init 或 d3000_board_init 函数时,它们会负责返回有效卡数 nCards,然后从 0-
nCards*4 - 1 自行按排好轴数。初始化函数就是 C++的 new 或 malloc 的操作,取得系统的资
源,但是控制卡的资源与内存不一样,取得资源后必需要释放才可以再次获取,即控制卡
资源是唯一的。

 

既然控制卡资源是唯一的,那么最好

Cctrlcard 产生的实例也是唯一的,这样,我们可以方

便的需要定义一个全局变量即可

CctrlCard g_Dmcard; 
在其它需要调用的地方,进行外部呼叫:

 

extern CctrlCard g_DmcCard; 

以上方法实在太简单了,很多人都会开心起来。实质上,方法还有很多,即然可以产生

n 多

对实例,我们的核心是只要保证调用

board_init 函数一次即可,故也可以单独定义一个

InitBoard 函数: 
class CctrlCard 

public: 
static int InitBoard(); //定义一个静态函数,以表警示 


int CctrlCard::InitBoard() 

return d1000_board_init(); 

还有一种方法,情况稍加复杂,但表达的功能也要强一些,以下展现可以稍微安慰一下代
码狂。

 

Class CctrlCard 

public: 
CctrlCard(); //请注意这个构造函数的定义 

CctrlCard::CctrlCard() 
{//呵呵,也很明了 
static int n(0); //注意,是个静态变量 

n++; //每次调用 CctrlCard 生成实例时,都会计数一次 
assert( n == 1 ); //在 DEBUG 版本下,只有 n==1 的情况下可以通过 
//否则,会出现致命错误,还好,它会告诉你错在哪个文件, 
//哪一行,呵呵,是个好东东啊。 

通过强行报警处理,当你有

g_DmcCard 这个实例时,其它的所有控制卡的定义都只能是以