【发布时间】:2021-03-17 00:43:16
【问题描述】:
我是一名“新”C 程序员,但也是一名老汇编程序员,几天来一直在寻找答案。
我正在尝试使用 C 结构构造解析消息中的多个字段(这是一个带有嵌入式 RTU modbus 数据包的 LORA 无线电)。
我有这个显示我的问题的示例代码:
#include <stdio.h>
#include <stdint.h>
struct MessageTable{
uint8_t msg_id;
uint8_t from;
uint8_t to;
unsigned flags1 : 1;
unsigned retransmitted : 1;
unsigned hops : 4;
union {
unsigned long millisecs;
unsigned char bytes[sizeof(unsigned long)];
} ms;
};
struct MessageTable message, *mp;
struct MessageTable message_table[8] = {0};
char buf[256];
void main(void) {
int i;
for (i=0; i<255; i++)
buf[i] = i;
mp = (struct MessageTable) &buf;
printf("To: %u, From: %u", mp->to, mp->from);
}
当我尝试编译时,我得到:
question.c: In function ‘main’:
question.c:27:18: error: conversion to non-scalar type requested
27 | mp = (struct MessageTable) &buf;
| ^~~~~~~~~~~~
我正在尝试做的是,在缓冲区空间中的某个任意位置覆盖结构,以便命名访问不同的字段,而不是使用硬编码的偏移量(即 to=buf[2]; 和 retransmitted = buf[3]&02x;
什么是干净、可读、合适的方法?
注意:在不同的 buf 位置会有多个结构(LORA 路由、Modbus Send、Modbus Rx、Modbus err 等...) 而且,这是纯 C,而不是 C++。
我不在乎缓冲区是否“跑出”结构的末尾,代码结构会处理这个问题。
【问题讨论】:
-
mp = (struct MessageTable*) buf;(没有&,buf由于数组/指针转换 C11 Standard - 6.3.2.1 Other Operands - Lvalues, arrays, and function designators(p3) 已经是指针)C17 标准的唯一变化是删除_Alignof作为例外(反正以前不需要) -
mp = (struct MessageTable*) buf;还要注意MessageTable*的添加。程序输出:To: 2, From: 1
标签: c data-structures struct