清单9-5顶部附近是一个新的数据结构,称为enum(即枚举)数据类型。枚举语法为:
enum NameOfEnum{enumMember List};
NameOfEnum是用于枚举的名称(或标记),它遵循普通变量命名规则。enumMemberList是一个以逗号分隔的列表,列出了要使用的枚举值。默认情况下,为列表分配的值从0开始,并按升序为每个成员分配序号。例如
enum days{SUNDAY,MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY};
将0与星期天关联,1与星期一关联,6与星期六关联。可以使用显式指定替代默认编号,例如:
enum speeds{RESIDENTIAL=35,STATEROAD=55,FEDERALHIGHWAY=70};
成员列表名称不必使用大写字母,但通常这样做是为了反映值在程序中被视为常量。
请务必注意,上面的语句是枚举数据声明,而不是枚举定义。要定义枚举变量,可以使用以下语法形式之一:
enum days myDay;
enum speeds{RESIDENTIAL=35,STATEROAD=55,FEDERALHIGHWAY=70}mySpeed;
第一条语句假定已在代码中声明days的枚举,并定义名为myDay的枚举变量。第二种形式声明了加速度物理量的枚举数据与它的枚举变量名为mySpeed。无论使用哪种语法形式,始终是一样的。
如果你感觉使用enums似乎和使用#define是一样的结果,那么你的感觉几乎是对的,一般在翻译器里,至少调试enums,但不能调试#define。因此,没有证据表明#define也可以在符号表中定义。也就是说,没有可追踪的左值。
枚举的不同之处在于它确实创建了一个可以在程序中跟踪的变量。由此,使用枚举比使用#define定义更容易调试。此外,有些人对enum更为满意的是使用了更熟悉的语法,以分号语句终止字符结尾。
在清单9-5中,枚举与糖果桶温度一起使用。假定枚举值为0(TOOCOLD)、1(TOOHOT)或2(JUSTRIGHT)。代码中使用该操作将索引函数指针到数组中。
请注意,让whichOperation()返回枚举型数据而不是int数据可能很有用,然而,随着该更改,编译器发出了一条错误消息。错误和解决方法可在http://arduino.cc/forum/index.php/topic,109584.0.html上查阅。虽然这是个好的解决方法,但我们暂时使用简单的做法。
代码清单9-5.Program Using an Array of Pointers to Functions
(https://www.xing528.com)


以上代码,其程序执行是建立与电脑的串行通信,并为随机数生成器添加种子。在loop()函数中,语句:
static void(*funcPtr[])()={TurnUpTemp,TurnDownTemp,PourCandy};这是该程序的核心。此语句创建并初始化名为funcPtr的数组,该数组是一个指向函数指针的数组。
如前所述,就像程序中定义的其他变量一样,每个函数都有一个左值标记该函数在内存中的位置。如果某个原因导致程序控制分支到下一条程序指令的内存位置,则与调用该函数完全相同。在这里面的特定的示例中,funcPtr[0]保存TurnUpTemp()函数的左值,funcPtr[1]保存TurnDownTemp()函数的左值,funcPtr[2]保存PourCandy()函数的左值。如在清单9-5中看到,这些函数中的每一个都只显示一条消息,表明函数被执行,允许你查看在程序执行时访问哪些函数。这样的“空”函数称为存根,是程序开发过程中常用的技术过程。图9-6显示了程序的运行结果。

图9-6 程序输出结果
该程序的核心是以下三点:
temp=ReadVatTemp();
whichAction=(enum temperatures)WhichOperation(temp);
(*funcPtr[whichAction])();
第一条语句调用ReadVatTemp()函数。我们对函数进行了编码,以返回100到350度之间的随机数(实际上,到那时,几乎所有温度为350℃的糖果都是一块碳)。然后从函数调用返回随机数并分配到temp中。
第二条语句将temp的值传递给whichOperation(),以确定温度太低、太高,或者刚好适合并将糖果倒入模具中。然后,对返回值强制转换到枚举变量whichAction中,以确定应调用哪个函数。
第三条语句使用whichAction作为索引调用相应的函数funcPtr[]数组。然后,程序控制被转移到该功能,该函数依次显示其相关的消息,如果你按下开发板上的复位按钮,虚线用于分隔运行集。
根据特定值调用特定函数的编程问题,指向函数指针的数组需要一点习惯,但为许多函数提供了一个优雅的解决方案。指向函数的指针对于自动化流程控制局势特别有用,因此,我们要把函数概念的指针深藏在自己的脑海里。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。
