指针关联器

在实际工作中,经常遇到矩阵,也就是二维数组
我们知道,二维数组作参数传递要变成一维指针,除非是固定宽度,才能用数组指针
另外,数组在那分配空间呢?
我曾经说过:在函数外分配,那么外部new和delete成对,也是常用的做法。但是要知道函数需要多大空间才行。在函数内分配,函数自己就知道该分多少,但是函数外就惨了,首先要通过参数或返回知道空间大小,还有就是在外部delete本身就是危险的,而且也容易忘。总之两难全!

总之,我们很难从指针中得到数组大小的信息。

很多人都想到了STL中的很多容器,的确是很好,但是有两个问题:
1,STL是封装的,对于我们这些在学校做工程软件算法的,,希望将整个过程清晰化,精益求精
2,用STL,老的函数改动太多,每个函数从参数到函数体中的变量都要改,工作量太大
当然,老函数也不用改,就那么用着也行

某天在研究STL的适配器的时候,突然想到:为什么不把指针和它的信息关联起来呢?(我不知道这是不是适配)
这仅仅是一个想法,不同的情况可以酌情使用

现在我用这个思想来解决数组传递的问题
首先定义指针关联器模板类,这个通用
//指针适配器
template<class T>
class CPtrMap :public std::map<void*,T>
{
public:
 CPtrMap() {};
 ~CPtrMap() {};
};

然后创建要关联的信息,我要关联的是矩阵大小,这个专用
// 矩阵信息 适配指针用
typedef struct  {
 unsigned int nWidth;
 unsigned int nHeight;
}MatrixSize;

产生指针关联信息表,这一般是个全局变量
extern CPtrMap<MatrixSize> _PtrMap;//这仅仅是声明,定义要在CPP中:CPtrMap<MatrixSize> _PtrMap;

接下来产生自定义的new和delete操作
template<class T> //sThisFile nThisLine 就是__FILE__和__LINE__了
T* _new(unsigned int nWidth,unsigned int nHeight,
  const char* sThisFile=NULL,int nThisLine=0)
{
 T* p;
#ifdef DEBUG_NEW
 if(sThisFile==NULL) 
  p = new(sThisFile,nThisLine) T[nWidth*nHeight];//这个不明白去网上查
 else
  p = new T[nWidth*nHeight];
#else
 p = new T[nWidth*nHeight];
#endif
 if(_PtrMap.find(p) != _PtrMap.end())//很罕见,被普通delete掉了,但是值还保留
 {
  _PtrMap.erase(p);
 }
 assert(p!=NULL);
 _PtrMap[p].nWidth = nWidth;
 _PtrMap[p].nHeight = nHeight;  

 return p;
}
template<class T>
void _delete(T* &p)
{
 delete []p;
 if(_PtrMap.find(p) != _PtrMap.end())
  _PtrMap.erase(p);
 p = NULL;
}
template<class T> //为了固定矩阵头,我经常使int* const p_0 = _new<int>(100,20);
void _delete(T* const &p)
{
 delete []p;
 if(_PtrMap.find(p) != _PtrMap.end())
  _PtrMap.erase(p);
 T* &pt = const_cast<T* &>(p);
 pt = NULL;
}


好了准备工作作完了,把上面的都加入一个头文件,使用时包含头文件就行,当然要定义那个全局变量才行
我是把它们加入我的代码库的dll中。提醒一下,全局变量在dll中处理很特殊,你可以搜一下dll的“共享段”方法

举个例子:
template<class T>
void chopBorder(T* &p_0,unsigned short nWidth)
{
int wWidth = _Ptrmap[p_0].nWidth;
int wHeight = _Ptrmap[p_0].nHeight;

 int nNewWidth,nNewHeight;
 nNewWidth = wWidth-2*nWidth;
 nNewHeight = wHeight-2*nWidth;
 T* const pNew = _new<T>(nNewHeight,nNewWidth);

 int i;
 for (i=0;i<nNewHeight;i++)
  memcpy(pNew+i*nNewWidth,p_0+(nWidth+i)*wWidth+nWidth,nNewWidth*sizeof(T));
 
 _delete(p_0);
 p_0 = const_cast<T*>pNew;
}
以上例子代码仅是示例,没有实际测试

这个方法改动代码小,还可以放到dll中(lib中因为共享全局变量的问题要注意)可以推荐
我只是提了个思想,其实那个关联信息还可以是类,或者其它的

======================2006.10.09补充

有人不断的建议我用vector,我承认vector确实很好,但是

如果用vector,要和老程序接口,这点很麻烦

比如老函数用指针,怎么办?将vector转成数组,在转换回来??
===============================================
编后语:
有什么问题,或是是想法和建议可以联系我
谢谢浏览!

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值