标准C语言中的联合(union),在Arduino中一样适用。联合是在存储区开辟一小块内存,用来存放不同的数据类型。联合就像一个小型缓冲区,能够保存预定义类型的数据。例如,有个读取多个传感器数据的程序,有些传感器返回char数据,有些传感器返回int数据,而有些传感器返回float类型数据。显然,你可以定义临时工作变量,例如:
char tempChar;
int tempInt;
float tempFloat;
然后将传感器读数分配到相应的变量中。这种方法使用8字节的内存。当然,使用union语法定义也可以:
union{
char tempChar;
int tempInt;
float tempFloat;
}sensorReading;
你还可以使用union标记,使用方式与结构时大致相同。如下面所示:
union sensorSystem{
char tempChar;
int tempInt;
float tempFloat;
};(www.xing528.com)
sensorSystem sensorReading;
它使用联合标记名sensorSystem来定义sensorReading。
定义为sensorReading的接头足够大,可以容纳三种传感器类型中的任何一种,但一次只能容纳一种。换句话说,你可以将一个浮点数放入union中,然后使用以下代码将其读回:
float currentFloatSensorReading = 51.25;
sensorReading.tempFloat=currentFloatSensorReading;//move data into the union
// some more code...
currentFloatSensorReading=sensorReading.tempFloat;//get the data back from the union
请注意如何使用点运算符引用相应的联合成员。点运算符的工作原理与它对结构的工作原理基本相同。如果希望从union读取int,则语句可能是:
currentIntSensorReading=sensorReading.tempInt;
联合的优点是可以将不同类型的数据移入和移出单个联合变量。此外,union只使用4字节的内存,而普通变量将使用8字节的内存(一个联合总是被分配足够的内存来容纳其成员的最大数据存储要求),这就是好消息。
坏消息是,你有责任跟踪union当前的情况。如果在联合中放置浮点,然后使用int成员访问联合,如下所示:
sensorReading.tempFloat=55.33;
//some code...
int myInt=sensorReading.tempInt;
然后,尽管你认为自己已经访问了一个int,但在myInt中你最终会得到“半个浮点”。通常,这样的代码很容易调试,但危险仍然存在。一些程序员定义了一组枚举来反映当前在联合中的数据类型,以避免这种混乱情况。请记住,当你使用union时,苹果进、橘子出几乎总是导致意外的结果。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。