void menu11(void);
void menu12(void);
void menu21(void);
typedef struct
{
byte a;
byte b;
byte c;
byte d;
byte e;
void (*operation)(void);
}TABLE;
TABLE table[3] =
{
{0, 0, 1, 0, 2, menu11},
{1, 0, 1, 1, 4, menu12},
{2, 2, 3, 0, 5, menu21},
};
void setup()
{
Serial.begin(9600);
delay(5000);
}
void loop()
{
for(int i=0;i<3;i++)
{
table[i].operation();
delay(1000);
}
}
以下是代码分析
typedef struct
{
byte a;
byte b;
byte c;
byte d;
byte e;
void (*operation)(void);
}TABLE;
定义一个结构体,里面包含了一个函数指针变量void (*operation)(void);
operation是一个指向函数的指针。
TABLE table[3] =
{
{0, 0, 1, 0, 2, menu11},
{1, 0, 1, 1, 4, menu12},
{2, 2, 3, 0, 5, menu21},
};
然后定义一个结构体数组,每一个数组都是一个结构体,最后的menu11,menu12,manu21都是函数的名字,因为函数的名字就是函数的地址。
void loop()
{
for(int i=0;i<3;i++)
{
table[i].operation();
delay(1000);
}
}
table[i].operation();这里的i在0,1,2之间变化。程序每次执行到这里,会把table[i].operation对应的menu11,menu12,menu21函数执行一遍。
执行的结果是在串口监视器里面显示:
这样做的好处是,只需要改变变量i的值就能执行不同的函数。比如运用到显示屏的刷新等等。