zoukankan      html  css  js  c++  java
  • (C)struct结构体

    对程序员的经验进行评估可以通过看其对struct结构体的使用情况。
    会不会用struct,怎样使用struct,是区别一个开发人员是否具备丰富开发经历的标志。

    在嵌入式系统的C/C++代码编程中,经常要传送的不是简单的字节流(char型数组),而是多种数据组合起来的一个整体,表现形式就是结构体。而经验不足的开发人员使用char型数组,通过指针偏移的方式进行报文传送。这样做一编写复杂,出错率高,可移植性差。

    例:
    传送A,B,C三种报文。

    struct A
    {
        int a;
        char b;
    };
    
    struct B
    {
        char a;
        short b;
    };
    
    struct C
    {
        int a;
        char b;
        float c;
    };

    优秀的报文设计:

    struct commu_packet
    {
        int packet_type;
        union
        {
            struct A packetA;
            struct B packetB;
            struct C packetC;
        };
    };

    这样在传送报文时就可以直接传送struct commu_packet.
    假如发送函数原型如下:

    //pSendData:要发送字节流的首地址
    //iLen:    要发送的字节流长度
    send(char *pSendData,unsigned int iLen)
    {
        ......
    };

    j接收函数原型如下:

    //pRcevData:接收字节流首地址
    //ILen:     要接受字节流长度
    //return:   返回实际收到的字节数
    unsigned int recv(char *pRcevData,unsigned int iLen)
    {
        ......
    };

    则,发送struct commu_packet的一个实例send_packet如下:
    send((char*)&send_packet,sizeof(commu_packet));
    接收保存在struct commu_packet的一个实例recv_packet如下:
    recv((char*)&recv_packet,sizeof(commu_packet));
    接着,判断报文类型并进行处理:

    ……
            switch(recv_packet.packet_type)
            {
                case packetA:
                ……
                break;
                case packetB:
                ……
                break;
                case packetC:
                ……
                break;
            }
    
  • 相关阅读:
    关于Design Complier/Library Compiler的跌坑(坑爹)记录
    博客暂时停更
    简单的Verilog测试模板结构
    存储器的设计/建模
    静态时序分析的三种分析模式(简述)
    Linux系统的基本使用
    Modelsim的使用——复杂的仿真
    Python-第三方库requests
    MySQL查询结果写入到文件总结
    MySQL创建函数报“ERROR 1418 ”错误,不能创建函数
  • 原文地址:https://www.cnblogs.com/yanghong-hnu/p/5699702.html
Copyright © 2011-2022 走看看