【问题标题】:Saving functions arguments in array of structures将函数参数保存在结构数组中
【发布时间】:2015-12-05 20:58:52
【问题描述】:

我是这个论坛的新手。非常少的编程经验。而且英语不是我的主要语言:)

我正在为微控制器编写 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:菜单测试,2:当前子菜单的大小(用于刷新),3:UP时跳转,4:down时跳转,5:enter时跳转,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;

一切都很完美。问题是我的菜单很长。这意味着我需要很多不同的函数(其中一些可以与参数结合使用)。

我的问题来了。如何将常量参数保存在结构数组中。有什么建议么。谢谢。

【问题讨论】:

  • 这不是论坛。
  • 你能把它们作为全局变量保存在你的代码中,让你的其他函数可以访问吗?
  • 1) SO 不是咨询网站。 2) 为您的函数使用正确的原型声明符,而不是 K&R 风格。 3)如果你需要很多函数,你认为如何减少函数的数量?
  • 抱歉有错误。我会更仔细地阅读规则。通过减少函数,我的意思是我做了一个函数来改变参数中的一个变量,我可以定义哪个方向和多少。我想避免很多全局变量,因为将来很难更改代码。
  • 你想要多少个参数?他们应该有什么类型?

标签: c arrays menu structure


【解决方案1】:

为了完成您的要求,我首先建议您从 C 语言转向更高级别的语言,至少对于您的用户界面而言。 (其余的低级语言可以保留在 C 中。)如今,您甚至可以在嵌入式系统中找到高级语言,并具有与 C 接口的功能。

但让我猜猜,这不是你的选择。

所以,为了完成您的要求,我建议的第二件事是使用 C 的 非常可怕的 hack,称为预处理器宏。

在 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,扩展以使用不同的常量等。淘汰自己!

【讨论】:

  • C 预处理器并没有被恰当地描述为一个 hack,无论是否美妙,它是该语言的基本部分。没有它,C 几乎不会是 C。每个 C 程序员都需要接受预处理器。哈克可能会吓跑新手。 :-)
  • @StephenG 我不确定是同意还是不同意。我认为向新手灌输一点对预处理器的敬畏和恐惧可能是一个好主意,因为是的,你可以用它做一些很棒的事情,而且,你可以用它大吃一惊。
  • 我一直在使用一些预处理器功能,但从未达到如此规模。通常只是#define 宏号或 ifdef。我会看看还有什么可以用它来完成。
  • @mike-nakis 也许给新秀一些尊重,而不是恐惧。但这是需要鼓励他们利用的东西(确实,正如你所做的那样),因为它非常有用。哎呀,有时我什至将 C 预处理器与 Java 一起使用。 TKos,我鼓励你学习 C 中的宏。它们可能很棘手,但你可以做其他任何方式都做不到的事情。
猜你喜欢
  • 2012-02-04
  • 1970-01-01
  • 2020-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多