Arduino:无法通过gcc编译器将union结构作为指针ac传递
我试图将结构与Arduino一起使用,但无法通过函数调用传递结构指针。使用gcc为我的计算机添加主函数和编译时,一切都正常,但使用Arduino IDE时,我会出错 我尝试的代码是: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
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的发射机发送信号。是的-事实上,尝试它比询问更快。