程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> MFC類庫之CArray作為函數參數和返回值

MFC類庫之CArray作為函數參數和返回值

編輯:關於VC++

一、獲得返回值:

可以作為函數的一個參數

比如定義fun(CArray<int, int &> &array)

采用引用類型,就可以直接使用

二、作為函數參數:

#include<Afxtempl.h>    
//定義函數。   
void ansnode(int num,CArray<double,double&> m_adX, CArray<double,double&> m_adY, CArray<double,double&> m_adZ);

函數體:

void ansysdata::ansnode(int num,CArray<double,double&> *m_adX, CArray<double,double&> *m_adY, CArray<double,double&> *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<num;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<num;i++)   
      {   
          outfilex<<m_adX.GetAt(i)<<endl;    
          outfiley<<m_adY.GetAt(i)<<endl;   
          outfilez<<m_adZ.GetAt(i)<<endl;   
       }   
}

三、CArray結構體中的應用

struct DriverItem    
{    
     CString strDriverName;    
     CString strProductDescribe;    
     CString strTBLFileName;    
};    
struct ControlItem    
{    
      CString strControlType;    
      CArray <DriverItem,DriverItem&> DriverArray;    
};

四、CArray的簡單說明

CArray <Object,Object> Var1;

CArray <Object,Object&> Var2;

第一個參數是CArray的返回的參數,第二個參數是傳遞給CArray的參數。即,當使用第二種形式定義Carray數組時,使用Add()時是一個引用類型的參數。

五、轉帖

最近一直在編寫一個繪圖程序,為了保存多個double型點坐標,這裡我采用了定義集合類CArray<TYPE, ARG_TYPE>CPointDArray來保存多點,然後定義坐標轉換函數ConvertToXYs(CPointDArray,long* xy),將double坐標轉換為long型坐標,這是就出現幾種常見錯誤,"CPointDArray缺少構造函數,或者是拷貝構造函數不存在”,‘不能將參數 1 從“CArray<TYPE,ARG_TYPE>”轉換為“CArray<TYPE,ARG_TYPE>”,從這兩個問題入手,舉例說明問題。

下面代碼為我修改多次後總結的一個實例,照著此方法可以推廣:

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 CArray<CPointD,CPointD>CPointDArray; //double 型數組   
typedef CArray<POINT,POINT&>LPointArray;//long型數組

注意這裡CArray<CPointD,CPointD>可以用CArray<CPointD*,CPointD*>,實驗證明沒有問題。

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<n;i++)   
          {   
               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

本文出自 “驿落黃昏” 博客,請務必保留此出處http://yiluohuanghun.blog.51cto.com/3407300/1118301

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved