c - Arduino:无法将 union 结构作为指针 ac 传递,我可以使用 gcc 编译器

标签 c pointers struct arduino unions

我正在尝试将结构与 Arduino 一起使用,但无法通过函数调用传递结构指针。添加主要功能并使用 gcc 为我的计算机编译时一切正常,但使用 Arduino IDE 时出现错误。

我试过的代码是:

typedef union
{
    struct
    {
        unsigned unit   :2;
        unsigned channel:2;
        unsigned status :1;
        unsigned group  :1;
        unsigned remote :26;
    };
    unsigned long data;
} Signal;

Signal signal;

void testPassingStruct(Signal *variable)
{
    variable->status = 1;
}

void setup()
{
    signal.status = 1;
    testPassingStruct(&signal);
}

void loop()
{
}

错误是:

structtest:2: error: variable or field ‘testPassingStruct’ declared void
structtest:2: error: ‘Signal’ was not declared in this scope
structtest:2: error: ‘variable’ was not declared in this scope

最佳答案

您有几个未命名 项目。这发生在 typedef 中。你可以试试,

union sig_union
{
    struct
    {
        unsigned unit   :2;
        unsigned channel:2;
        unsigned status :1;
        unsigned group  :1;
        unsigned remote :26;
    } d;                       /* Note the name here. */
    unsigned long data;
} signal;
typedef union sig_union Signal;

然后在你的代码中你需要,

void testPassingStruct(Signal *variable)
{
    variable->d.status = 1;
}

您还可以为掩码和位字段使用定义。通常,它可以更清楚地控制哪些位在哪里,并且编译器将在两种情况下生成类似的代码。例如,

#define SIG_UNIT(d)    (d&0x3)
#define SIG_CHANNEL(d) (d&0xc>>2)
#define SIG_STATUS(d)  (d&0x10)
/* etc. */

特别是对于位很重要的系统编程,这更好,因为我不相信“C”位字段指定它们的放置方式。最重要的是,我相信它会编译。

关于c - Arduino:无法将 union 结构作为指针 ac 传递,我可以使用 gcc 编译器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21055234/

相关文章:

c - 取消引用结构指针内的指针

动态数组的 C memcpy 行为

C 指向数组/指针数组的指针消歧

c - 如何获得 2^100 * 3^3 模 1000000007 的结果

c - C 循环中递增整数指针

Swift-如何使用函数或其他模式初始化结构实例

c - 测试输入值类型的函数

c++ - 转换警告。和类错误

C:使用空指针数组

c++ - 结构中的数组