Arduino如何通过Serial/OLED打印当前数组中的函数名称?
我找到一个包含多种LED图案的Arduino程序,可通过按键切换图案,运行正常。现在想为其添加OLED显示屏,显示当前图案的编号和名称。编号可以正常打印,但尝试打印图案名称时出现错误:no matching function for call to 'println(void (*&)())'。
相关代码如下:
typedef void (*SimplePatternList[])(); SimplePatternList gPatterns = { PurpleRipple, twoDots, fillAndCC, blinkyblink2, spewFour, spew, confetti_GB, rainbow, confetti, sinelon, juggle }; uint8_t gCurrentPatternNumber = 0; // Index number of which pattern is current
循环内通过gPatterns[gCurrentPatternNumber]();调用对应编号的图案,例如编号0对应PurpleRipple。使用oled.print(gCurrentPatternNumber);可以正常打印0、1、2等编号,但使用oled.print(gPatterns[gCurrentPatternNumber]);时出错,Serial.print也有同样问题。请问如何正确通过Serial/OLED打印当前图案的函数名称?
解决方法
函数指针仅存储函数的内存地址,Arduino的print/println函数无法直接将函数指针转换为函数名称字符串,需手动建立函数名称与索引的对应关系:
创建图案名称字符串数组
新建一个与gPatterns长度、索引完全匹配的字符串数组,每个元素对应图案函数的名称:const char* gPatternNames[] = { "PurpleRipple", "twoDots", "fillAndCC", "blinkyblink2", "spewFour", "spew", "confetti_GB", "rainbow", "confetti", "sinelon", "juggle" };需确保数组元素数量、顺序与
gPatterns完全一致,保证索引一一对应。打印图案名称
通过当前图案编号gCurrentPatternNumber访问字符串数组元素,即可正常打印:// OLED打印编号与名称 oled.print(gCurrentPatternNumber); oled.print(": "); oled.println(gPatternNames[gCurrentPatternNumber]); // Serial打印同理 Serial.print(gCurrentPatternNumber); Serial.print(": "); Serial.println(gPatternNames[gCurrentPatternNumber]);后续维护提示
若新增图案,需同时在gPatterns和gPatternNames两个数组中添加对应的函数与名称,保持索引一致,避免对应错误。
内容的提问来源于stack exchange,提问作者Mister Woyng

