我是这个论坛的新手。非常小的编程经验。英语不是我的主要语言:))
我正在为微控制器编写C代码,现在我创建了带有结构数组的图形菜单。在这个数组中,我按下了按钮(UP,DOWN,ENTER),菜单文本和按下按钮时调用的函数的跳转(如果你在正确的子菜单上,你可以调用函数)。
结构定义:
typedef const struct Menu_structure
{
const char *text;
unsigned char Menu_points;
unsigned char Menu_button_UP;
unsigned char Menu_button_DOWN;
unsigned char Menu_button_ENTER;
Menu_Waveform_parameter_t Waveform_parameter_value;
void (*Menu_function_UP) ();
void (*Menu_function_DOWN) ();
void (*Menu_function_ENTER) ();
} MenuEntry;
1:菜单tekst,2:当前子菜单的大小(用于刷新目的),3:在UP情况下跳转,4:在向下情况下跳转,5:在输入情况下跳转,6:参数枚举,7 :按下按钮时调用的函数。
数组示例:
MenuEntry menu[] =
{
{menu_01, 5, 0, 0, 0, 0, 0, 0, 0},
{menu_02, 5, 1, 2, 1, 0, 0, 0, funtion_0},
{menu_03, 5, 1, 3, 6, 0, 0, 0, 0},
{menu_04, 5, 2, 4, 11, 0, 0, 0, 0},
{menu_05, 5, 3, 4, 1, 0, 0, 0, funtion_1},
}
呼叫功能代码(按下输入按钮)
case Button_ENTER: if (menu[Menu_selected].Menu_function_ENTER != 0)
{
menu[Menu_selected].Menu_function_ENTER();
}
break;
一切都很完美。问题是我的菜单很长。这意味着我需要很多不同的功能(其中一些可以与参数的使用相结合)。
这是我的问题。如何在结构数组中保存常量参数。有什么建议。谢谢。
答案 0 :(得分:0)
为了实现您的要求,我首先建议您从C语言转到某种更高级别的语言,至少对于您的用户界面而言。 (其余的低级内容可以保留在C.)现在,即使在嵌入式系统中也可以找到高级语言,并且具有与C接口的功能。
但我想,这不适合你。
所以,我要推荐的第二件事就是使用那个被称为预处理器宏的非常糟糕的黑客。
在C中你可以像这样定义一个宏:
#define MYMACRO(a,b,c,d,e,i) { a, b, c, d, e, 0, 0, 0, i }
那么你的表看起来如下:
{
MYMACRO( menu_01, 5, 0, 0, 0, 0},
MYMACRO( menu_02, 5, 1, 2, 1, funtion_0},
MYMACRO( menu_03, 5, 1, 3, 6, 0},
MYMACRO( menu_04, 5, 2, 4, 11, 0},
MYMACRO( menu_05, 5, 3, 4, 1, funtion_1},
}
当然,您可以使用不同的参数定义MYMACRO
的各种不同版本,扩展为使用不同的常量,等等。自己敲门!