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_main
是 对 menu_main
的引用,但这是不正确的。 &menu_main
是 menu_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 };
您可以预先创建两个菜单,然后将一个或另一个作为具有浅表副本的结构传递(假设菜单项字符串不变)。
我有一个数组:
#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_main
是 对 menu_main
的引用,但这是不正确的。 &menu_main
是 menu_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 };
您可以预先创建两个菜单,然后将一个或另一个作为具有浅表副本的结构传递(假设菜单项字符串不变)。