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条回答
edmund1234
1楼-- · 2019-07-22 03:36
本帖最后由 edmund1234 于 2018-11-29 09:35 编辑
一起哈皮 发表于 2018-11-29 09:22
你确定这样可以?什么原理?我放keil5里试还是会报错不是常量

我经常都这样用的, 把你试的代码贴出来看看
一起哈皮
2楼-- · 2019-07-22 09:19
 精彩回答 2  元偷偷看……
edmund1234
3楼-- · 2019-07-22 09:50
一起哈皮 发表于 2018-11-29 09:39
你是不是在函数里这样定义并初始化的,函数里定义并初始化编译器会正确的取buff[5]数值填充。我定义全局b ...

recvdef 有多少个成员, 你就要填充多少个数, 你只填一个数当然不行了
你就按样主的代码, 加上我给的, 就自然可以
一起哈皮
4楼-- · 2019-07-22 12:01
edmund1234 发表于 2018-11-29 09:43
recvdef 有多少个成员, 你就要填充多少个数, 你只填一个数当然不行了
你就按样主的代码, 加上我给的 ...

你看,x号就是提示不是常量的错误,说明你的方法不行

你看,x号就是提示不是常量的错误,说明你的方法不行

你看,x号就是提示不是常量的错误,说明你的方法不行
edmund1234
5楼-- · 2019-07-22 13:40
一起哈皮 发表于 2018-11-29 09:51
你看,x号就是提示不是常量的错误,说明你的方法不行

recvC = (recvdef) {
        buff[5],
        buff[5],
        buff[5],
        buff[5],
        buff[6],
        buff[6],
        buff[6],
        buff[6]
        };       

这一段你放在哪儿? 放在函数外而?
edmund1234
6楼-- · 2019-07-22 17:04
本帖最后由 edmund1234 于 2018-11-29 09:57 编辑

。。。。。。。。。。。。。。。。

一周热门 更多>