【问题标题】:pointer to const array of ints指向 const 整数数组的指针
【发布时间】:2014-08-06 11:40:35
【问题描述】:

我在嵌入式系统中创建了一个菜单结构如下:

struct DisplayMenu
{
    short int MenuTitle;                                        // Menu title text offset - the title used in the calling menu
    char NoOfSubmenuItems;                                      // number of submenuItems in this menu ? static!
    char PositionInLastMenu;                                    // position in previous menu - helps restore previous menu screen
    struct DisplayMenu *PreviousMenu;                           // pointer to previous menu - need to be const?
    struct DisplayMenu *NextMenu[MAX_NO_OF_SUBMENU_ITEMS];      // array of pointers to submenus structs - Null if no submenu...function call instead
    void (*MenuFunctionsArray[MAX_NO_OF_SUBMENU_ITEMS])(void);  // array of function pointers - called if no submenu. Check if null
    const short int *SubMenuText;                               // pointer array of text offsets for submenu text - no set length variable length array allowed at end of struct in GCC at least
};

因此为早期原型设计实例化:

const short int MainMenuTextStrings[]= { tSTATUS, tSETUP, tStartOfTextString, tANALYSER, tUNITS, tEndOfTextString, tUNITS, tALARM, tSCREEN, tREPORTS, tSERVICE, tStartOfTextString, tMANUAL, tAIR, tZERO, tEndOfTextString, tStartOfTextString, tMANUAL, tEndOfTextString, NULL };     // needs a new text entry

// main menu struct
struct DisplayMenu MainMenu =
{
    tMENU,                                                                                              // Menu title
    0,                                              // number of submenus
    0,                                                                                                  // no previous menu 
    NULL,                                                                                               // no previous menu to point to
    { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL },                                     // to be set up later
    { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL },                                     // function pointers
    MainMenuTextStrings
};

以期稍后初始化功能/菜单指针等

使用 GCC 可以编译,但是当代码运行时(已经启动并运行了一个非动态菜单系统)IDE(MPLABX)正在努力查看 MainMenu 的内容,当我尝试运行函数 DisplayMenuItems (如下)我无法通过它

谁能发现我定义结构和实例化它的方式有什么问题?

我打算使用以下函数来使用结构体显示项目:

void DisplayMenuItems(struct DisplayMenu* Menu)
{

    while(*(Menu->SubMenuText) != NULL)
    {
        if(*(Menu->SubMenuText) == tStartOfTextString)       //if a few text strings need to be concatenated on one line
        {
            while(*(Menu->SubMenuText++) != tEndOfTextString)  //keep printing until you find the EndofTextString ident
                WriteStringToDisplay((char*) &pText[Config.ucLanguage][*(Menu->SubMenuText)], SmallFont);
        }
        else /*if(*(Menu->SubMenuText) != NULL) */
        {
            WriteStringToDisplay((char*) &pText[Config.ucLanguage][*(Menu->SubMenuText)++], SmallFont);
        }
        DisplayCarriageReturn(2,SmallFont);         // try and remove this eventually? Just increment Lcd.ucLine instead
    }
}

GCC 可能会让我摆脱一些我不应该在这里做的事情,所以任何提示都非常感谢!

非常感谢

【问题讨论】:

  • 那个演员和埋葬的*(Menu->SubMenuText)++看起来一点都不健康。
  • while(*(Menu->SubMenuText) != NULL) 的目的是什么? *(Menu->SubMenuText) 返回 short int 值。将其与 NULL 进行比较完全没有意义。

标签: c gcc embedded pic32


【解决方案1】:

问题可能是您正在修改循环中的指针。这意味着如果DisplayMenuItems 函数被第二次调用,指针将不再指向MainMenuTextStrings 数组,而是超出它并访问该数据会导致undefined behavior

与其修改指针,不如简单地使用数组索引语法?

喜欢

for (unsigned int i = 0; Menu->SubMenuText[i] != NULL; ++i)
{
    ...
}

【讨论】:

  • +1 不是你的错,但如果 OP 对 tSTATUS 等神秘值的任何选择是 0,那么无论是这个还是他们的代码都不能工作。 NULL 比较是一个坏主意(同样,你没有把它带到聚会上;OP 做到了)。一个单独的成员SubMenuTextCount 会让这个更干净的恕我直言。
  • 我使用 tSTATUS 等作为文本字符串数组的偏移量。所以我为每个菜单都有一个这些偏移量的数组。我在这个数组的末尾有一个 NULL int 条目来知道什么时候停止。但是可以考虑使用 SubMenuTextCount 来代替
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-04
  • 2021-12-08
  • 2018-10-14
  • 1970-01-01
  • 1970-01-01
  • 2012-01-24
  • 1970-01-01
相关资源
最近更新 更多