#include <stdio.h>
#include <stdint.h>
struct {
char a;
short b;
int c;
}buf;
int main(void) {
printf("%d",sizeof(buf));
return 0;
}
结果为8,因为有效对齐值N是最终用来决定数据存放地址方式的值。有效对齐N表示“对齐在N上”,即该数据的“存放起始地址%N=0”。而数据结构中的数据变量都是按定义的先后顺序存放。第一个数据变量的起始地址就是数据结构的起始地址。结构体的成员变量要对齐存放,结构体本身也要根据自身的有效对齐值圆整(即结构体成员变量占用总长度为结构体有效对齐值的整数倍)。
C语言字节对齐问题详解 - clover_toeic - 博客园
2.
#include <stdio.h>
#include <string.h>
//#define
union seat{
struct {
unsigned char type; //0x01:ZIGBEE 振动传感器
unsigned char channel; //传感器通道号(该字段作为Zigbee的本机地址)(默认1)
unsigned short panId; //Zigbee通讯参数-PANID(默认1)
unsigned char freqBand; //Zigbee通讯参数-频段(默认11)
unsigned char txPower; //Zigbee通讯参数-发送功率(默认4dbm)
float accCoe; //加速度灵敏度系数
char sn[10]; //传感器序列号“0000180001”
char mainVersion[8]; //传感器主板硬件版本号“V1.24”
char sampleVersion[8]; //传感器采集板硬件版本号“V1.21”
char name[15]; //传感器蓝牙名称
unsigned char model[2]; //传感器型号
unsigned char keep[128]; //预留
char softVersion[10]; //版本
}__attribute__((packed)) data;
unsigned char buf[191];
}Fifo;
int main()
{
unsigned char source[]={0x01,0x01,0x0A,0x00,0x0B,0x00,
0x00,0x00,0x80,0x3F,0x32,0x33,0x33,0x31,
0x31,0x00,0x00,0x00,0x00,0x00,0x56,0x31,0x2E,0x36,0x00,0x00,0x00,
0x00,0x56,0x31,0x2E,0x30,0x00,0x00,0x00,0x00,0x44,0x54,0x5F,0x5A,
0x42,0x5F,0x32,0x33,0x33,0x31,0x31,0x00,0x00,0x00,0x00,0x00,0x02,
0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x56,0x31,
0x31,0x31,0x2E,0x39,0x00,0x00,0x00,0x00};
memcpy((char*)Fifo.buf,(char*)source,sizeof(Fifo));//内存拷贝函数
for(int i=0;i<sizeof(Fifo.data.name);i++)
printf("%c ",Fifo.data.name[i]);
return 0;
}
3.MFC SetLocalTime()设置时间不成功主要是程序权限不够,在vs中
(项目右键---属性---连接器---清单文件---uac执行级别 选择requireAdministrator )中文版
(project->property->Configuration Properties->Linker->Manifest File->UAC Execution Level 选择requireAdministrator)英文版
重新编译 这样你的程序直接运行就拥有管理员权限了。
4.MFC多线程中运行UpdateData()会让程序崩溃;

5.Fomat使用格式化转换要注意。

6.MFC串口打印中文乱码问题,直接Format()无法打印成功。通过BYTE->char->CString 解决。
VARIANT variant_input;
COleSafeArray safearray_inp;
// COleVariant myVar;
LONG len, k;
BYTE rxdata[4096] = {0}; //设置BYTE数组 An 8-bit integerthat is not signed.
/*CString strtemp;*/
CString swit;
if (m_Lock == false)
{
/*Sleep(500);*/
m_Lock = true;
if (m_mscom.get_CommEvent() == 2) //事件值为2表示接收缓冲区内有字符
{////////以下你可以根据自己的通信协议加入处理代码
variant_input = m_mscom.get_Input(); //读缓冲区
safearray_inp.Attach(variant_input); //VARIANT型变量转换为ColeSafeArray型变量
len = safearray_inp.GetOneDimSize(); //得到有效数据长度
for (k = 0; k < len; k++)
safearray_inp.GetElement(&k, rxdata + k);//转换为BYTE型数组
//这样才能显示中文
CString *p = new CString((char*)rxdata, len);
swit = *p;
}
本文介绍了C语言中结构体的字节对齐问题,通过实例展示了字节对齐的计算,并探讨了MFC在设置时间权限、多线程和串口通信中的注意事项,包括UpdateData()可能导致的崩溃、Format函数的使用以及解决串口打印中文乱码的方法。

2646

被折叠的 条评论
为什么被折叠?



