打印

一个结构体的问题

[复制链接]
2073|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wgy596|  楼主 | 2014-5-8 17:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
网上看了一个帖子关于结构体的

在网络协议、通信控制、嵌入式系统的C/C++编程中,我们经常要传送的不是简单的字
节流(char型数组),而是多种数据组合起来的一个整体,其表现形式是一个结构体。

经验不足的开发人员往往将所有需要传送的内容依顺序保存在char型数组中,通过指
针偏移的方法传送网络报文等信息。这样做编程复杂,易出错,而且一旦控制方式及通信
协议有所变化,程序就要进行非常细致的修改。

  一个有经验的开发者则灵活运用结构体,举一个例子,假设网络或控制协议中需要传
送三种报文,其格式分别为packetA、packetB、packetC:

struct structA
{
int a;
char b;
};

struct structB
{
char a;
short b;
};

struct structC
{
int a;
char b;
float c;
}
  优秀的程序设计者这样设计传送的报文:

struct CommuPacket
{
int iPacketType;  //报文类型标志
union      //每次传送的是三种报文中的一种,使用union
{
  struct structA packetA;
  struct structB packetB;
  struct structC packetC;
}
};
  在进行报文传送时,直接传送struct CommuPacket一个整体。

  假设发送函数的原形如下:

// pSendData:发送字节流的首地址,iLen:要发送的长度
Send(char * pSendData, unsigned int  iLen);
发送方可以直接进行如下调用发送struct CommuPacket的一个实例sendCommuPacket:
Send( (char *)&sendCommuPacket , sizeof(CommuPacket) );
假设接收函数的原形如下:
// pRecvData:发送字节流的首地址,iLen:要接收的长度
//返回值:实际接收到的字节数
unsigned int Recv(char * pRecvData, unsigned int  iLen);
  接收方可以直接进行如下调用将接收到的数据保存在struct CommuPacket的一个实例
recvCommuPacket中:

Recv( (char *)&recvCommuPacket , sizeof(CommuPacket) );
  接着判断报文类型进行相应处理:

switch(recvCommuPacket. iPacketType)
{
    case PACKET_A:
    …    //A类报文处理
    break;
    case PACKET_B:
    …   //B类报文处理
    break;
    case PACKET_C:
    …   //C类报文处理
    break;
}



上面的这种用法我最近也在想这么用,但是用着发现问题了
我结构体的成员里面有指针变量、并且成员长度不一致
这样导致我调用发送函数时size of的长度不对,所以我想问下大家
对于这种结构体内含指针变量且成员长度不一致(对齐问题)的是怎么处理的

可以定义过一个数组,在发送的时候把结构体内的数据一个一个赋值给数组,然后直接发送数组么?这样做效率是不是低了




相关帖子

沙发
逗你玩~~~| | 2014-5-8 17:41 | 只看该作者
含指针的机构其长度也是确定的,而若内含数组其数组大小也应该确定。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
wgy596 + 1 很给力!
板凳
wgy596|  楼主 | 2014-5-8 18:33 | 只看该作者
指针长度等我赋值的时候是会确定,但是如果不是u16的倍数的话,会多出字节

使用特权

评论回复
地板
lanmp| | 2014-5-8 23:40 | 只看该作者
指针长度在编译时就定下来了,是常量

使用特权

评论回复
5
wgy596|  楼主 | 2014-5-9 08:10 | 只看该作者
我的长度是sizeof结构体,然后加上指针的具体长度,减去指针的长度

使用特权

评论回复
6
wgy596|  楼主 | 2014-5-9 11:10 | 只看该作者
有哪位高手这样处理过

使用特权

评论回复
7
NE5532| | 2014-5-9 15:23 | 只看该作者
优秀的程序设计者,会根据实际情况分析用什么数据结构进行处理,而不是机械地死记硬背,不然“优秀”从何谈起?

使用特权

评论回复
8
啊龙| | 2014-5-10 10:22 | 只看该作者
确实不明白sizeof用法,如果size是个宏,在编译阶段就处理结束了,数据确定很好处理。如果sizeof能处理动态结构,应该编译为函数。看了一些资料,也不清楚。也请熟悉的高手指明。
比如 void * memset(void * s,int c,sizeof(s)),这个能编译通过吗?如果通过了,sizeof(s)是个确定的值,还是个函数输出的变量。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

16

帖子

0

粉丝