MFC类库之CArray作为函数参数和返回值
一、获得返回值:
成都创新互联专业为企业提供城北网站建设、城北做网站、城北网站设计、城北网站制作等企业网站建设、网页设计与制作、城北企业网站模板建站服务,10余年城北做网站经验,不只是建网站,更提供有价值的思路和整体网络服务。
可以作为函数的一个参数
比如定义fun(CArray &array)
采用引用类型,就可以直接使用
二、作为函数参数:
#include
//定义函数。
void ansnode(int num,CArray m_adX, CArray m_adY, CArray m_adZ);
函数体:
void ansysdata::ansnode(int num,CArray *m_adX, CArray *m_adY, CArray *m_adZ)
{
double x, y,z; int i;
fstream infilex;
fstream infiley;
fstream infilez;
infilex.open("d:/intface/M_ADX.TXT.txt",ios::in);
infiley.open("d:/intface/M_ADX.TXT.txt",ios::in);
infilez.open("d:/intface/M_ADX.TXT.txt",ios::in);
for (i=0;i
{
infilex>>x;
infiley>>y;
infilez>>z;
m_adX.Add(x);
m_adY.Add(y);
m_adZ.Add(z);
}
fstream outfilex;
fstream outfiley;
fstream outfilez;
outfilex.open("d:/intface/M_ADX1.TXT.txt",ios::in);
outfiley.open("d:/intface/M_ADX2.TXT.txt",ios::in);
outfilez.open("d:/intface/M_ADX3.TXT.txt",ios::in);
for (i=0;i
{
outfilex<
outfiley<
outfilez<
}
}
三、CArray结构体中的应用
struct DriverItem
{
CString strDriverName;
CString strProductDescribe;
CString strTBLFileName;
};
struct ControlItem
{
CString strControlType;
CArray DriverArray;
};
四、CArray的简单说明
CArray
CArray
第一个参数是CArray的返回的参数,第二个参数是传递给CArray的参数。即,当使用第二种形式定义Carray数组时,使用Add()时是一个引用类型的参数。
五、转帖
最近一直在编写一个绘图程序,为了保存多个double型点坐标,这里我采用了定义集合类CArrayCPointDArray来保存多点,然后定义坐标转换函数ConvertToXYs(CPointDArray,long* xy),将double坐标转换为long型坐标,这是就出现几种常见错误,"CPointDArray缺少构造函数,或者是拷贝构造函数不存在”,‘不能将参数 1 从“CArray”转换为“CArray”,从这两个问题入手,举例说明问题。
下面代码为我修改多次后总结的一个实例,照着此方法可以推广:
1.建立一个VC6工程 ,在CTestView中,添加一个OnLButtonDown,在这里实现点的绘制。
2.在CTestView.h中,自定义double类型的点类以及数组
class CPointD
{
public:
double x; //longtitude
double y; //latitude
CPointD()
{
x =0;
y=0;
};
CPointD(const double dx,double dy)
{
x = dx;
y = dy;
};
CPointD(const CPointD& pnt)
{
x = pnt.x;
y = pnt.y;
};
CPointD& operator=(const CPointD& rhs)
{
if (this == &rhs)
{
return *this;
}
x = rhs.x;
y = rhs.y;
return *this;
}
};//double 型指针链表
typedef CArrayCPointDArray; //double 型数组
typedef CArrayLPointArray;//long型数组
注意这里CArray可以用CArray,实验证明没有问题。
3.在视图类CTestView定义全局变量CPointDArray plist;
定义函数void ConvToXYs(const CPointDArray &alist, LPointArray& llist);//&alist为常应用,保存函数中不修改数据,&llist是alist转
//换成long后的数组。这里就是出现上述常见问题的症结。
下面为实现部分
void CTestLineView::ConvToXYs(const CPointDArray &alist, LPointArray& llist)
{
if (alist.GetSize()>0)
{
llist.RemoveAll();
int i ;
int n = alist.GetSize();
llist.SetSize(n);
double jing, wei;
for(i=0;i
分享标题:MFC类库之CArray作为函数参数和返回值
本文地址:http://cdiso.cn/article/jecepi.html
{
CPointD p = alist.GetAt(i);
jing = p.x;
wei = p.y;
llist[i].x = (long)(jing+0.5);//这是关键步骤,可以当数组用
llist[i].y = (long)(wei+0.5);//
}
4.在鼠标左键事件中实现绘制:
void CTestLineView::OnLButtonDown(UINT nFlags, CPoint point)
{
CClientDC pDC(this); try
{
CPen* pOldPen = (CPen*)pDC.SelectStockObject(2);
for (int i=0;i<10;i++)
{
// CPointD *p=new CPointD(i*3.5f,i*5.5f);
plist.Add(CPointD(i*3.5f,i*5.5f));
}
LPointArray longpoints;
ConvToXYs(plist,longpoints);
pDC.Polyline(longpoints.GetData(),plist.GetSize());
CString str;
str.Format("%d",longpoints.GetSize());
AfxMessageBox(str,MB_OK);
// Restore the original device context objects.
pDC.SelectObject(pOldPen);
}
catch (CException* e)
{
LPTSTR lp="" ;
e->GetErrorMessage(lp,250);
AfxMessageBox(lp);
}
CView::OnLButtonDown(nFlags, point);
}
最后在~CTestLineView中清除plist。
CTestLineView::~CTestLineView()
{
if(plist.GetSize())
plist.RemoveAll();
}
大概就这么多了,通过学习,希望能够给大家一个思路,将来能够很娴熟的应用CArray。
http://blog.csdn.net/eattonton/article/details/5278540
分享标题:MFC类库之CArray作为函数参数和返回值
本文地址:http://cdiso.cn/article/jecepi.html