首页 理论教育 Arduino单片机实战开发技术:标准C语言联合的应用

Arduino单片机实战开发技术:标准C语言联合的应用

时间:2023-10-23 理论教育 版权反馈
【摘要】:标准C语言中的联合,在Arduino中一样适用。换句话说,你可以将一个浮点数放入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只使用4字节的内存,而普通变量将使用8字节的内存,这就是好消息。一些程序员定义了一组枚举来反映当前在联合中的数据类型,以避免这种混乱情况。

Arduino单片机实战开发技术:标准C语言联合的应用

标准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时,苹果进、橘子出几乎总是导致意外的结果。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈