Arduino/C++ 带引用的指针数组

Arduino/C++ An array of pointers with reference

我有一个数组:

    #define SELECT_KEY 1
    char *menu_main[] = { "Individual", "OFF", "ON", "Initialise", "Scan", "Read"};
    char *individ_sub_menu[] = { "item1", "Item2" };
    char *inview_menu = &menu_main;
    int selectPos = 0;
    
    int getKeyPress()
    {
       //for purpose of this example
       return 1;
    } 


    void updateMenu()
    {
        uint8_t uiKeyCode = getKeyPress();
        if (uiKeyCode == SELECT_KEY && inview_menu[selectPos] == "Individual")
        { 
           inview_menu = &individ_sub_menu
        }
    }

所以我遇到了一个问题: 错误:无法在初始化时将 'char* (*)[6]' 转换为 'char*'

希望我可以在这两个 char 指针数组之间切换引用并根据该 inview 菜单访问内容

char *menu_main[] 是指向 char.

的指针数组

&menu_main 是指向 char.

指针数组的指针

char *inview_menu 是指向 char.

的单个指针

显然这些是不兼容的类型。

你可能想要char **inview_menu = menu_main;

(注意数组 衰减 到表达式中的指针)

此外,C++ 禁止将字符串文字转换为非常量 char*。所以使用 const char*.

const char *menu_main[] = { "Individual", "OFF", "ON", "Initialise", "Scan", "Read"};
const char *individ_sub_menu[] = { "item1", "Item2" };
const char **inview_menu = menu_main;

menu_main是一个指针数组,你懂的。

您似乎认为 &menu_mainmenu_main 的引用,但这是不正确的。 &menu_mainmenu_main 的地址,&address-of 运算符。这很令人困惑,因为不同上下文中的相同符号 & 确实表示引用。但是,您可能没有像我一样在技术意义上使用参考。

无论如何没关系,你拥有的是一个数组,你可以很容易地使用指针来引用数组,就像这样

char *menu_main[] = { "Individual", "OFF", "ON", "Initialise", "Scan", "Read"};
char *individ_sub_menu[] = { "item1", "Item2" };
char **inview_menu = menu_main;

void updateMenu()
{
    uint8_t uiKeyCode = getKeyPress();
    if (uiKeyCode == SELECT_KEY && inview_menu[selectPos] == "Individual")
    { 
       inview_menu = individ_sub_menu;
    }
}

请注意,因为您有一个指针数组,所以 inview_menu 是指向指针的指针(也称为双指针)。另请注意,此代码中不需要地址运算符 &

EDIT 还要注意 inview_menu[selectPos] == "Individual" 是不正确的。您不能使用 == 来比较 C 字符串,您应该使用 strcmp 函数。

    if (uiKeyCode == SELECT_KEY && strcmp(inview_menu[selectPos], "Individual") == 0)

停止在 C++ 代码中使用原始 c 数组,它会变得容易得多(请注意,您应该做一些与“定义”不同的事情,但我保留了它):

    #include <vector>
    #include <string>
    using namespace std;

    #define SELECT_KEY 1
    vector<string> menu_main = { "Individual", "OFF", "ON", "Initialise", "Scan", "Read"};
    vector<string> individ_sub_menu = { "item1", "Item2" };
    vector<string>* inview_menu = &menu_main;
    int selectPos = 0;
    
    int getKeyPress()
    {
       //for purpose of this example
       return 1;
    } 


    void updateMenu()
    {
        uint8_t uiKeyCode = getKeyPress();
        if (uiKeyCode == SELECT_KEY && (*inview_menu)[selectPos] == "Individual")
        { 
           inview_menu = &individ_sub_menu;
        }
    }

这两个数组有两种不同的类型:

char *menu_main[] = { "Individual", "OFF", "ON", "Initialise", "Scan", "Read"};
char *individ_sub_menu[] = { "item1", "Item2" };

menu_main 得到类型 char *[6]individ_sub_menu 得到类型 char *[2]。除非擦除该数组类型,否则不能通过同一接口传递两者,这可以通过使用指向数组第一个元素的指针来完成。您必须分别 pass\store 数组大小:

const char *menu_main[] = { "Individual", "OFF", "ON", "Initialise", "Scan", "Read"};
const char *individ_sub_menu[] = { "item1", "Item2" };

struct menu {   
    unsigned     item_count;
    const char **items;
} inview_menu =  { sizeof(menu_main)/sizeof(menu_main[0]) , menu_main };

您可以预先创建两个菜单,然后将一个或另一个作为具有浅表副本的结构传递(假设菜单项字符串不变)。