Rerefence to a const char* array

10,862

Solution 1

Essentially you neeed to make listOfOptions a char **;

An array of pointers can be referenced through a pointer to pointers (that's what the char ** is).

The size will be unknown to anyone using listOfOptions thus you need a way to determine the size. Either terminate the list with a NULL pointer or you will have to use a 2nd variable (listOfOptionsSize) that tracks the size.

So the code below should compile (I opted for the NULL terminated lists).

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);

Now for your printing function, it will get the pointer to the list of pointers as a parameter and and will look like this:

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++;
     }
}

Oh, and welcome to C-Pointer Hell :-)

Solution 2

const char *FirstlistOfOptionText[2] is an array of two pointers to char.

const char *listOfOptions[] is an array of unknown size with pointers to char.

const char **listOfOptions; is a pointer to a pointer to char and you can assign it the address of your list of options array:

listOfOptions = FirstlistOfOptionText;
Share:
10,862
Biribu
Author by

Biribu

Updated on June 07, 2022

Comments

  • Biribu
    Biribu almost 2 years

    I am trying to avoid to repeat my code for 5 differentes arrays. I have 3 arrays (could be more in future):

    const char *FirstlistOfOptionText[2]   = {OPT_1, 
                                             OPT_2};
    const char *SecondlistOfOptionText[2]   = {OPT_1, 
                                             OPT_2};
    const char *ThirdlistOfOptionText[2]  = {OPT_1, 
                                             OPT_2};    
    

    THe elements in each one will not be the same. Now they are because I just copy&paste them. Number of elements won't neither.

    I have a function in which I want to print every element of a list depending on a value I give as parameter. Also, I need to print one of those elements in other color (all in white except one in green).

    I just want to have one code for printing and selecting the color as I have right now. But I want to select the correct array before doing that. I thought about:

    const char *listOfOptions[];
    if(menu_t.first_level_option == 0) {
        listOfOptions = FirstlistOfOptionText;
    }
    if(menu_t.first_level_option == 1) {
        listOfOptions = SecondlistOfOptionText;
    }
    if(menu_t.first_level_option == 2) {
        listOfOptions = ThirdlistOfOptionText;
    }
    

    But I get some errors about storage size of 'listOfOptions' isn't known. Or that I can't use const char** for a char* or thing like that.

    What is the correct way to do this?