Arduino:无法通过gcc编译器将union结构作为指针ac传递

Arduino:无法通过gcc编译器将union结构作为指针ac传递,c,pointers,struct,arduino,unions,C,Pointers,Struct,Arduino,Unions,我试图将结构与Arduino一起使用,但无法通过函数调用传递结构指针。使用gcc为我的计算机添加主函数和编译时,一切都正常,但使用Arduino IDE时,我会出错 我尝试的代码是: typedef union { struct { unsigned unit :2; unsigned channel:2; unsigned status :1; unsigned group :1; unsig

我试图将结构与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
s上。你可以试试

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”位字段指定它们的放置方式。最重要的是,我相信它会编译。

您有几个未命名的项目。这发生在
typedef
s上。你可以试试

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”位字段指定它们的放置方式。最重要的是,我确信它会被编译。

它基本上是一个联合体,没有结构成员的名称(我在下面的代码中将其称为部分)。试试这个

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

union Signal signal;

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

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

void loop()
{
}

它基本上是一个联合体,缺少一个结构成员的名称(我在下面的代码中称之为parts)。试试这个

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

union Signal signal;

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

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

void loop()
{
}

ATMega/AVR可能与嵌套结构/联合有问题。它有有限的8位寄存器。我认为defines肯定会起作用,尽管还有一点锅炉板代码。它是4个字节,即2个寄存器。几乎没有什么比ATtiny10更强大的了。@IgnacioVazquez Abrams是的,但对于大多数CPU来说,它只是一个寄存器;我只是说,编译器可能对此有疑问,这并非难以捉摸;我想这是我注意到的其他问题。特别是,如果是寄存器分配,则错误消息会有所不同。ATMega/AVR可能与嵌套结构/联合有问题。它有有限的8位寄存器。我认为defines肯定会起作用,尽管还有一点锅炉板代码。它是4个字节,即2个寄存器。几乎没有什么比ATtiny10更强大的了。@IgnacioVazquez Abrams是的,但对于大多数CPU来说,它只是一个寄存器;我只是说,编译器可能对此有疑问,这并非难以捉摸;我想这是我注意到的其他问题。特别是,如果是寄存器分配,则错误消息会有所不同。然后,我是否能够使用signal.data对构成32位的所有5个部分进行迭代?我需要它通过433Mhz发射机发送信号。是的-事实上,尝试它比询问更快。然后我是否能够使用signal.data在构成32位的所有5个部分上进行迭代?我需要它通过433Mhz的发射机发送信号。是的-事实上,尝试它比询问更快。