我想缩短我的代码,代码的目的是控制步进电机.我想要保持步数(32 bits)和旋转频率(16 bits).我通过一条总线以102格式接收此信息.我的 idea 是不必将每一位乘以256/65535.来补齐步数和频率.我可以通过unions 做到这一点,但我也想拥有多个马达,所以我决定宣布一个 struct ,让unions 参与其中.它不断地给我错误,所以我显然是做错了什么.

我认为声明 struct 中的联合不是问题,因为联合占用的内存空间等于它最大的成员,它们可能是 struct 元素似乎是合理的.以下是一段代码片段:

struct Stepper_Motor
  {
        union Num_Steps
        {
            uint32_t Sum_Steps;
            uint8_t Arr_Steps[4];
        };

        union Rotation_freq
        {
            uint16_t Sum_Freq;
            uint8_t Arr_Freq[2];
        };

        uint8_t State;
  };

当我在声明 struct 成员后try 访问它时,当我写下其中一个成员时,IDE会给我一个 struct 成员的列表:

```
struct Stepper_Motor Motor1,Motor2,Motor3;

//Some code... //

Motor1.Arr_Freq[0] = something;  // this gives me an error,  "no members named Arr_Freq"
```

我还try 了以下几种方法:

Motor1.Rotation_freq.Arr_Freq[0] = something;  //error

有没有可能做我想做的事?我是否必须在 struct 外声明unions ,然后在 struct 内引用它们,如果是,如何引用?这是一种使用联合的虚假方式,以省go 编写乘法吗?

推荐答案

如果从联合中删除标记名,则它们是匿名的:

struct Stepper_Motor
{
        union
        {
            uint32_t Sum_Steps;
            uint8_t Arr_Steps[4];
        };

        union
        {
            uint16_t Sum_Freq;
            uint8_t Arr_Freq[2];
        };

        uint8_t State;
};

然后,unions 成员将显示为 struct 的成员.

C++相关问答推荐

在struct中调用函数,但struct在void中 *

如何设置指针指向在函数中初始化的复合文字中的整数?

为什么我不能只在内存地址中添加一个int来寻址任何数组?

将数据移动到寄存器时出现分段故障

在Rust和C之间使用ffi时如何通过 struct 中的[U8;1]成员传递指针

对于C中给定数组中的每个查询,如何正确编码以输出给定索引范围(1到N)中所有数字的总和?

如何在C中使数组变量的值为常量?

强制转换变量以在 struct 中蚕食

如何在zOS上编译共享C库

CS50 pset 5的皱眉脸正确地处理了大多数基本单词,并且拼写判断不区分大小写.

宏观;S C调深度

共享目标代码似乎不能在Linux上的进程之间共享

x86-64平台上的int_fast8_t大小与int_fast16_t大小

在列表中查找素数

无法将字符串文字分配给 C 中的字符数组

为什么孤儿进程在 Linux 中没有被 PID 1 采用,就像我读过的一本书中声称的那样?

子进程不会修改父进程中的统计信息

与 C 相比,C++ 中无副作用的无限循环的好处是 UB?

运行以下 C 程序时出现分段错误

c 函数指针,另一种语法