http://www.zahui.com/html/9/36475.htm
用過VC的人可能都用過其中各種各樣的Array類,在我也常用到,這讓我編寫程式方便了很多。
做電力自動化的同行可能都知道,咱這行興組態這個方法,不管理是做什麼軟體,都要組態一把,呵呵,說來笑話,直到今天我也沒有真正的找到組態這一個詞的明確解釋。我一直把它理解為“不需要程式員修改程式,調試人員或使用者就可以完成新的系統監控”。即使是使用DOS5.0做為作業系統的產品或是沒有作業系統的產品,我們一樣要組態、再組態。
最近這段時間在開發一個嵌入式的組態系統,使用DOS5.0,開發環境為Borlandc 3.1。為了在這樣一個系統上實現我的組態功能,可是費了我不少心事設計,其中一項就是要解決畫面的顯示問題。組態系統要求使用者自己設計畫面,那麼我們就來設計一個可以修改的監控畫面,在VC開發後台時我使用Array類來儲存監控畫面的每一個對象,可是在BC31中呢,多少年都沒有用過它了,我不知道它是不是也有Array類,有的話,這個類應該怎麼用,與其再尋找學習,不如自己動手編寫一個,看樣子,我是一個標準的CODE MAN,不管什麼東東總想自己來寫。
不過還好,當年在學校的中資料結構還是沒有白學。問題很快得到解決。
我使用了一個雙向鏈表解決這個問題,用它來實現結點的添加和刪除實在太方便了。
下面就是這個類的原始碼部分,在此貼出,也希望和我一樣,愛號、狂熱於程式設計的朋友批抨指正。
首先貼上來的是我的一個資料類型定義,習慣了VC,就按VC的格式轉換一下,當然,有經驗的一看就知道是學UCOS的,呵呵,這點我承認,偉大的思想家魯迅教育我們:要取其精華
/*
********************************************************
*
* (c) Copyright 2003,Hu Wenjin
* All Right Reserved
*
* WRITE USE ANSI c
*
* File: datadef.h
* Auther: Hu Wenjin
* Data: 11.4.2003
*********************************************************
*/
/*
*********************************************************
* DATA TYPES DEFINE
*********************************************************
*/
#if !defined( _DATADEF_H )
#define _DATADEF_H
typedef signed long INT;
typedef unsigned long DWORD;
typedef INT BOOL;
typedef unsigned char bool;
typedef unsigned char BYTE;
typedef unsigned short WORD;
typedef float FLOAT;
typedef unsigned long UINT;
typedef unsigned long DWORD;
typedef DWORD COLORREF;
typedef char CHAR;
typedef short SHORT;
typedef long LONG;
typedef unsigned char INT8U;
typedef signed char INT8S;
typedef unsigned int INT16U;
typedef signed int INT16S;
typedef unsigned long INT32U;
typedef signed long INT32S;
typedef char* LPCTSTR;
#define TRUE 1
#define FALSE 0
#define true 1
#define false 0
typedef struct
{
LONG left;
LONG top;
LONG right;
LONG bottom;
}RECT;
#endif
再接下來的,當然是 .h 檔案了
#if !defined( _PTRARRAY_H )
#define _PTRARRAY_H
#include "datadef.h"
/*
*************************************************************************
FILE: PtrArray.h
AUTHER: HuWenjin
DATA: 9.27,2004
Discrption:
Modification:
1.
*************************************************************************
*/
typedef struct
{
void* m_pObj; //結點中包含的資料指標
void* m_pParent; //上一個結點
void* m_pChild; //下一個結點
int m_nIndex; //本結點在隊列中的位置
BOOL m_bDeleted; //本結點是否被刪除
}ST_OBJ;
class CJinPtrArray
{
public:
CJinPtrArray( );
virtual ~CJinPtrArray( );
public:
void* SetAt(int nIndex,void* pObj); //修改指定點的對象指標為新指標
int GetCount( ); //擷取總數
int Append( void* pObj ); //添加一個,從刪除隊列中添加,如果沒有測再重建5個一組
int DeleteAt( int nIndex ); //刪除指定,沒有釋放記憶體,保留下次使用(5個結點一組)
void* GetAt( int nIndex ); //擷取指定的對象
int RemoveAll( ); //清空全部結點資料,結點沒有釋放記憶體,保留下次使用
protected:
ST_OBJ* m_pData; //對象指標
int m_nCount; //對象總數
protected:
int MemFree( ); //從記憶體中刪除所有的資料
void* Sort( int nIndex = 0 ); //刪除對象後排序,重設對列中的序號
};
#endif
最後就是CPP檔案了
/**************************************************************************
FILE: PtrArray.CPP
AUTHER: HuWenjin
DATA: 9.27,2004
Discrption:
Modification:
1.
**************************************************************************/
#include "Includes.h"
#include "PtrArray.h"
///////////////////////////////////////////////////////////////////////////
// CJinPtrArray
CJinPtrArray::CJinPtrArray( )
{
m_pData = NULL;
m_nCount = 0 ;
}
CJinPtrArray::~CJinPtrArray()
{
MemFree( );
}
int CJinPtrArray::MemFree( )
{
ST_OBJ* pObj;
ST_OBJ* pObjNext;
pObj = m_pData;
while( 1 )
{
if( !pObj )
break;
pObjNext = (ST_OBJ*)pObj->m_pChild;
delete pObj;
pObj = pObjNext;
}
return 0;
}
int CJinPtrArray::GetCount( )
{
return m_nCount;
}
int CJinPtrArray::RemoveAll( )
{
ST_OBJ* pObj = m_pData;
while( 1 )
{
if( !pObj )
break;
pObj->m_bDeleted = TRUE;
pObj->m_nIndex = -1;
pObj = (ST_OBJ*)pObj->m_pChild;
}
m_nCount = 0 ;
return 0;
}
int CJinPtrArray::Append( void* pObjAdd )
{
ST_OBJ* pObj = m_pData;
if( !pObjAdd )
return -1;
// 尋找是否有空閑記憶體區,如果有則加入
while( 1 )
{
if( !pObj )
break;
if( pObj->m_bDeleted == TRUE )
{
pObj->m_pObj = pObjAdd;
pObj->m_bDeleted = FALSE;
pObj->m_nIndex = m_nCount;
m_nCount ++;
return ( m_nCount-1 );
}
pObj = (ST_OBJ*)pObj->m_pChild;
}
// 沒有空閑記憶體區,則再申請1個資料區加入
pObj = NULL;
pObj = new ST_OBJ;
if( !pObj )
return -1;
pObj->m_bDeleted = FALSE;
pObj->m_pObj = pObjAdd;
pObj->m_nIndex = m_nCount;
m_nCount ++;
pObj->m_pParent = NULL;
pObj->m_pChild = m_pData;
if( m_pData )
m_pData->m_pParent = pObj;
// 儲存當前的指標做為 ROOT 指標
m_pData = pObj