我试图避免为5个不同的数组重复我的代码。我有3个阵列(未来可能更多):
<?php if(#date != null)
每个元素都不一样。现在他们是因为我只是复制并粘贴它们。元素数量也没有。
我有一个函数,我想根据我给出的值作为参数打印列表的每个元素。此外,我需要以其他颜色打印其中一个元素(全部为白色,绿色除外)。
我只想拥有一个用于打印和选择颜色的代码。但是我想在这之前选择正确的数组。我想过:
const char *FirstlistOfOptionText[2] = {OPT_1,
OPT_2};
const char *SecondlistOfOptionText[2] = {OPT_1,
OPT_2};
const char *ThirdlistOfOptionText[2] = {OPT_1,
OPT_2};
但是我在“listOfOptions&#39;”的存储空间大小方面遇到了一些错误。不知道。或者我不能将const char **用于char *或类似的东西。
这样做的正确方法是什么?
答案 0 :(得分:1)
const char *FirstlistOfOptionText[2]
是一个包含两个指向char的指针的数组。
const char *listOfOptions[]
是一个未知大小的数组,带有指向char的指针。
const char **listOfOptions;
是指向char的指针,你可以为它分配选项列表数组的地址:
listOfOptions = FirstlistOfOptionText;
答案 1 :(得分:1)
基本上你需要将listOfOptions设为char **;
可以通过指向指针的指针引用指针数组(这就是char **)。
使用listOfOptions的任何人都不知道大小,因此您需要一种方法来确定大小。使用NULL指针终止列表,或者必须使用跟踪大小的第二个变量(listOfOptionsSize)。
所以下面的代码应该编译(我选择了NULL终止列表)。
const char *FirstlistOfOptionText[] = {"a", "b", NULL};
const char *SecondlistOfOptionText[] = {"c", "d", "e", "f", NULL};
const char *ThirdlistOfOptionText[] = {"e", "f", "g", NULL};
const char **listOfOptions= NULL; // pointer to pointer(s)
int first_level_option= 2; // some value for testing
if(first_level_option == 0) {
listOfOptions = FirstlistOfOptionText;
}
if(first_level_option == 1) {
listOfOptions = SecondlistOfOptionText;
}
if (first_level_option == 2) {
listOfOptions = ThirdlistOfOptionText;
}
printem(listOfOptions);
现在对于你的打印功能,它会将指针列表的指针作为参数,并且看起来像这样:
void printem(const char **listOfOptions)
{
const char *word;
while (*listOfOptions!=NULL) { // while the pointer in the list not NULL
word= *listOfOptions; // get the char * to which listOfOptions is pointing
printf("entry: %s\n", word);
listOfOptions++;
}
}
哦,欢迎来到C-Pointer地狱: - )
答案 2 :(得分:0)
const char *listOfOptions[];
但是我对“listOfOptions”的存储大小有些错误是未知的。
数组的大小是其类型的一部分。 T[1]
和T[2]
是不同的类型。
没有指定大小的数组是不完整类型,您无法创建不完整类型的对象。
或者我不能将const char **用于char *或类似的东西。
是的,因为那些是完全不同的类型。第一个是指向常量char
对象的指针。第二个是指向非常量char
对象的指针。
您的代码会尝试将数组视为一等公民,您可以将其指定为“普通”对象,例如int
。它还试图平等地处理不同维度的数组。这些都不起作用。 C ++数组比你想象的更有限。
因此,解决方案是使用std::vector
。当你接触它时,std::string
而不是char*
。
#include <string>
#include <vector>
#define OPT_1 "a"
#define OPT_2 "b"
int main()
{
std::vector<std::string> FirstlistOfOptionText = { OPT_1, OPT_2 };
std::vector<std::string> SecondlistOfOptionText = { OPT_1, OPT_2 };
std::vector<std::string> ThirdlistOfOptionText = { OPT_1, OPT_2 };
int first_level_option = 0;
std::vector<std::string> listOfOptions;
if (first_level_option == 0) {
listOfOptions = FirstlistOfOptionText;
}
if (first_level_option == 1) {
listOfOptions = SecondlistOfOptionText;
}
if (first_level_option == 2) {
listOfOptions = ThirdlistOfOptionText;
}
}
当然,这可以(而且应该)进一步改进。例如,删除预处理器宏并将列表选择放入像std::vector<std::string> GetListOfOptions(int)
这样的函数中。
答案 3 :(得分:0)
要打印选项列表,您可以使用模板函数,该函数将静态数组作为参数引用:
template <int n>
void PrintOptions(const char* (&listOfOptions)[N])
{
for (int i = 0; i < N; i++)
{
//actual printing
}
}
void PrintMenu(/* ... */)
{
//...
switch (menu_t.first_level_option)
{
case 0:
PrintOptions(FirstlistOfOptionText);
break;
case 1:
PrintOptions(SecondlistOfOptionText);
break;
case 2:
PrintOptions(ThirdlistOfOptionText);
break;
}
//...
}
数组的大小将由编译器推断。