該死的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)看下回分解
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)
點(diǎn)擊舉報(bào)。