分享

VxWorks操作系统复位实战(三)[by Progsoft]

 海鹏 2009-11-07
该死的While循环
本文将列举一个使用While循环导致死循环的实例。
但凡看过一点通讯协议的人对以下的数据结构应该不会陌生:
+-----------------+
|    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 |  ......     |
+---+-------------+
具体举例如下:
该数据结构在某协议的定义里面是这样的。
TAG 是 1个字节,从0~0xFF,表明某数据的类型
LEN 是 1个字节,表明该数据的总长度(包括TAG+LEN+CONTENT)
CONTENT 数据内容的长度根据LEN来确定。
其中某种TAG的内容字段,可能是包涵其他N个TAG及其内容。(N值一般没有显式定义)
对照这个图我们可以看到:
TAG1 就包涵有TAG1.1、TAG1.2 ...
那么我们程序一般会怎么写呢?
为使程序简单,我们先做一些假设:
1、TAG1已解码
2、TAG1的长度等于usLen
3、TAG1的内容从aucBuffer[0]开始
5、MsgContent记录TAG、LEN、CONTENT的偏移
6、MsgContent定义足够大不会溢出

usOffset = 0;
usCount  = 0;
while (usOffset < usLen)
...{
    /**//* 记录TAG */
    MsgContent[usCount].Tag = aucBuffer[usOffset];
    /**//* 记录该TAG的内容长度 */
    MsgContent[usCount].Len = aucBuffer[usOffset + 1];
    /**//* 记录该TAG的地址,注意此处一般不会将内容拷贝出来,到实际使用的时候在取 */
    MsgContent[usCount].Content = usOffset;
    /**//* 解码下一个TAG的偏移 */
    usOffset += aucBuffer[usOffset + 1];
    /**//* 记录TAG数目 */
    usCount++;
}
这个程序有些什么错误呢?请看下回分解
 
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/progsoft/archive/2007/01/21/1488951.aspx

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多