該死的While循環(huán)
本文將列舉一個(gè)使用While循環(huán)導(dǎo)致死循環(huán)的實(shí)例。
但凡看過一點(diǎn)通訊協(xié)議的人對(duì)以下的數(shù)據(jù)結(jié)構(gòu)應(yīng)該不會(huì)陌生:
+-----------------+
| tag_1 | +-----------------+ | len_1 | +---+-------------+ | c | tag_1.1 | + +-------------+ | o | len_1.1 | + +-------------+ | n | content_1.1| + +-------------+ | t | tag_1.2 | + +-------------+ | e | len_1.2 | + +-------------+ | n | content_1.2| + +-------------+ | t | ...... | + +-------------+ | 1 | ...... | +---+-------------+ 具體舉例如下: 該數(shù)據(jù)結(jié)構(gòu)在某協(xié)議的定義里面是這樣的。
TAG 是 1個(gè)字節(jié),從0~0xFF,表明某數(shù)據(jù)的類型
LEN 是 1個(gè)字節(jié),表明該數(shù)據(jù)的總長(zhǎng)度(包括TAG+LEN+CONTENT)
CONTENT 數(shù)據(jù)內(nèi)容的長(zhǎng)度根據(jù)LEN來確定。
其中某種TAG的內(nèi)容字段,可能是包涵其他N個(gè)TAG及其內(nèi)容。(N值一般沒有顯式定義)
對(duì)照這個(gè)圖我們可以看到:
TAG1 就包涵有TAG1.1、TAG1.2 ...
那么我們程序一般會(huì)怎么寫呢?
為使程序簡(jiǎn)單,我們先做一些假設(shè):
1、TAG1已解碼 2、TAG1的長(zhǎng)度等于usLen 3、TAG1的內(nèi)容從aucBuffer[0]開始 5、MsgContent記錄TAG、LEN、CONTENT的偏移 6、MsgContent定義足夠大不會(huì)溢出 usOffset = 0; usCount = 0; while (usOffset < usLen) ...{ /**//* 記錄TAG */ MsgContent[usCount].Tag = aucBuffer[usOffset]; /**//* 記錄該TAG的內(nèi)容長(zhǎng)度 */ MsgContent[usCount].Len = aucBuffer[usOffset + 1]; /**//* 記錄該TAG的地址,注意此處一般不會(huì)將內(nèi)容拷貝出來,到實(shí)際使用的時(shí)候在取 */ MsgContent[usCount].Content = usOffset; /**//* 解碼下一個(gè)TAG的偏移 */ usOffset += aucBuffer[usOffset + 1]; /**//* 記錄TAG數(shù)目 */ usCount++; } 這個(gè)程序有些什么錯(cuò)誤呢?請(qǐng)看下回分解 本文來自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:http://blog.csdn.net/progsoft/archive/2007/01/21/1488951.aspx
|
|