C 结构体初始化

2019-07-21 07:14发布

因通信协议不确定,可能更改。现在程序中要取出命令字进行判断,不想在代码中充满USARTx_RX_BUF[5],想要代码便于更改和维护,
所以想到结构体。在com1.h中声明结构体
typedef struct {
        u8 u1c1;
        u8 u2c1;
        u8 u3c1;
        u8 u4c1;
        u8 u1c2;
        u8 u2c2;
        u8 u3c2;
        u8 u4c2;
}recvdef;

在com1.c中定义结构体
recvdef recvC=
{
        USART1_RX_BUF[5], //第一个命令字
        USART2_RX_BUF[5],
        USART3_RX_BUF[5],
        USART4_RX_BUF[5],
        USART1_RX_BUF[6], //第二个命令字
        USART2_RX_BUF[6],
        USART3_RX_BUF[6],
        USART4_RX_BUF[6]
};

USARTx_RX_BUF[5]是串口收到的数据位置,是第一个命令字
USARTx_RX_BUF[6]是串口收到的数据位置,是第二个命令字

USARTx_RX_BUF[5]和USARTx_RX_BUF[6]是在uart.c中定义的变量,在uart.h中声明
com1.c文件已包含uart.h头文件,
因为结构体成员初始化不能是变量;所以报错expression must have a constant value
除了#define,还有什么办法能解决这个问题?


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
42条回答
d1z1y2
1楼-- · 2019-07-25 16:16
楼主还是在程序执行时初始化吧,与编译时初始化效果是一样的,结构体和变量应该都是在RAM区,上电后值是不确定的,编译时初始化的方式 ,我的理解应该是在Flash区保存了初始化的值,编译器汇编出来的程序应该是自动加入了对变量或结构体的赋值指令,
学艺不精,欢迎指教。
gotofly21
2楼-- · 2019-07-25 17:02
 精彩回答 2  元偷偷看……
jindizhiwa
3楼-- · 2019-07-25 20:36
不好意思,赶项目,加班。没及时看帖子,先感谢大家讨论技术问题。
是这样的,因为通信协议没确定,所以接收的命令字可能位置会变化,而在代码中要根据接收的命令字做相应处理。所以先在代码中这样定义了
#define recvC10   USART1_RX_BUF[5]
#define recvC11   USART2_RX_BUF[5]
#define recvC12   USART3_RX_BUF[5]
#define recvC13   USART4_RX_BUF[5]
#define recvC20   USART1_RX_BUF[6]
#define recvC21   USART2_RX_BUF[6]
#define recvC22   USART3_RX_BUF[6]
#define recvC23   USART4_RX_BUF[6]

本来是想用结构体的,但结构体成员初始化时报错。所以先这样做了。
楼上各位提到的方法,在项目不太急的时候我会再试。
感谢各位!
jindizhiwa
4楼-- · 2019-07-25 23:26
四天前看了  原子哥  的回复后没再看帖,欢迎大家理性讨论 纯粹的技术问题
yklstudent
5楼-- · 2019-07-26 00:09
楼主这样做有什么高明的地方?感觉完全没必要讨论啥
jindizhiwa
6楼-- · 2019-07-26 05:02
没有什么高明的地方。只是觉得用结构体也可以,但当时没搜到方法,所以看看有人能有高招不?

一周热门 更多>