把一個對象放到結構裏面出現的問題[2004年4月26日 9:27]

正在做一個數據轉發的東西,本來公司只是要求用BCB做一個出來。BCB的做了出來,感覺挺好玩,於是又用VC做了一遍,當然,BCBVC是想起來當然是大部分不一樣的。現在又想擴充一下,用VC做個服務程序出來,可以動態申請開端口(原來只是一個服務端口)。具體的有空再說吧!

下面把CArray放到結構裏,

typedef struct tagMainService

{

       TCHAR          DisabledAddr[30];

       CArray arrSubService;

}MAINSERVICE, *LPMAINSERVICE;

然後

MAINSERVICE m;

SUBSERVICE s;

m.arrSubService.Add(s);

這樣用,應該沒有什麼問題吧!的確沒有問題。

可是今天,我是用的時候卻跳出莫名其妙Debug錯誤。而且出在了我第一次調用arrSubService的地方。停止的地方在

1.  Add

2ASSERT_VALID(this);

2.  ASSERT(nIndex >= 0);//停在這裏

3.  AfxAssertValidObject

先看到nIndex>=0,這個明顯是對的呀!怎麼出錯會在這裏?想了半天不能明白。廢話少說,還是把真想馬上揭露吧。我在程序中多次用到了memset函數。結構體不用memset怎麼行呢!相信高手應該看出什麼端倪來了!memsetCArray對象的初始化也清除掉了,呵呵,雖然是對象,也會出現和new出來的一樣找不到this。上面,VC真正斷的應該是ASSERT(this)

原因找到了,要解決它,也簡單把

CArray arrSubService;

換成CArray *pArrSubService;

memset以前記得把pArrSubService 清除掉。如果要保存CArray裏面的數據,可以用一個臨時的CArray指針接管,然後memset了以後,再指回去,注意要先把pArrayOld=NULL,要不然Array的結構也沒了。使用以前先new一個。這樣,新的問題也出來了。

m_MainService.arrSubService[i]. DisabledAddr

原來上面這句是直接可以用的,現在當[i]後面那個點出來的時候,可以見到VC提示CArray的函數,可是編譯通不過。想想,應該是arrSubService轉換成指針後出現的問題。一般我們用

char *p = new char[100];

p[10]=’a’;

這樣是不會有問題,CArray和這個慣例逆了,修改成

(*m_MainService.arrSubService)[i]. DisabledAddr

呵呵,這樣就行了。

發佈了38 篇原創文章 · 獲贊 0 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章