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条回答
xianshasaman
1楼-- · 2019-07-25 01:24
edmund1234 发表于 2018-11-29 11:48
现在我问你我说的吹在哪里啊? 为什么报错啊? 不懂就说不懂, 别东拉西扯

你说加个强制转换就行了。
1.你自己看看楼主的代码加个强制转换能不能解决问题?
2.你自己再好好想想是不是楼主的代码不加强制转换就可以解决问题?

你的办法不好使,好使的办法和你没关系,你不是吹牛逼是什么?
我们在论坛讨论问题谁不是知错就改?就你特殊?别人不理你还追着人杠,你这么闲还不如回去好好翻翻书
civic7366
2楼-- · 2019-07-25 06:24
不用加是因為初始化, 執行時才改寫的要加
24F那個是因為初始化才不用加
還有魔術棒裡的C99要打勾

話說~
我第一次看到13F對結構成員的賦值寫法時(同事的代碼)
心理也是在想這是C語言嗎
civic7366
3楼-- · 2019-07-25 06:30
 精彩回答 2  元偷偷看……
feichangkunge
4楼-- · 2019-07-25 07:14
楼主都不解释,我想对他不是很重要
edmund1234
5楼-- · 2019-07-25 09:10
xianshasaman 发表于 2018-11-29 12:06
你说加个强制转换就行了。
1.你自己看看楼主的代码加个强制转换能不能解决问题?
2.你自己再好好想想是 ...

小朋友, 别见到个括号就喊强制转换,强制转换的意思是先前定义后再重新定义的叫强制转换, 找个你稍微懂一点的题再吹哈。

我说的是不是吹的可不是你说了算, 不懂却装早就知道的, 心里明白, 还强制转换呢。


xianshasaman
6楼-- · 2019-07-25 10:23
edmund1234 发表于 2018-11-29 18:51
小朋友, 别见到个括号就喊强制转换,强制转换的意思是先前定义后再重新定义的叫强制转换, 找个你稍微懂 ...

你好好看看自己在说什么吧。
你可以自己测试一下,预先定义第二个结构变量,recvdef recvC_2,然后在第一个结构变量赋值后,给它赋值为第一个变量的值
recvC_2 = recvC;
你看看这里不加(recvdef)会不会报错,要是你还不明白为什么,那就没办法了,谁也帮不了你,你自己查手册吧。

另外,这个问题和强制转换叫不叫强制转换可有一点关系?你拐到这里来讨论强制转换的名字就能证明你对?结果还闹个乌龙。你这么瞎扯就是说的越多错的越多,你不理解强制转换,那就查手册去,硬杠真没用,这里不是文史类的论坛,搞技术就是实事求是,大家都不傻,你要是真能指明我哪里确实说错了,大家都会服你,我也服你,但是你这么睁着眼瞎说只会丢人现眼。

一周热门 更多>