Передать массив struct по указателю в функцию C для обновления ссылки на указатель - PullRequest
0 голосов
/ 20 марта 2020

C ++ позволяет передавать по ссылке, но не в C.

Вопрос в том, как использовать функцию C для обновления ссылки на массив структуры, передаваемой указателем.

Мой вопрос лучше объяснить с помощью кода.

enum ch_numbers {
        CH_00,
        CH_01,
        CH_02,
        CH_03,
        CH_04,
        CH_05,
    };

    enum sen_numbers {
        SEN_0,
        SEN_1,
        SEN_2,
        SEN_3,
        SEN_4,
    };

    struct ch_sen_map {
        enum ch_numbers ch_num;
        enum sen_numbers sen_num;
    };

    struct ch_sen_map map1[] = {
        {CH_02, SEN_3},
        {CH_03, SEN_1},
        {CH_01, SEN_4},
    };

    struct ch_sen_map map2[] = {
        {CH_01, SEN_1},
        {CH_02, SEN_3},
        {CH_04, SEN_2},
    };

    void UpdateMap(struct ch_sen_map * map)
    {
        map = map1;
    }

    struct ch_sen_map * GetMap(void)
    {
        return map1;
    }

    void main()
    {
        int i;
        struct ch_sen_map *pMap;
        int mapsize = sizeof(map1)/sizeof(struct ch_sen_map);

        printf("\n Expected map1 (straight forward):");
        for (i=0; i<mapsize; i++) {
            printf("\n %d : %d", map1[i].ch_num, map1[i].sen_num);
        }

        pMap = map2;

        printf("\n Expected map2 :");
        for (i=0; i<mapsize; i++) {
            printf("\n %d : %d", pMap[i].ch_num, pMap[i].sen_num);
        }

        UpdateMap(pMap);  // Not working as I expect

        printf("\n Expected map1 :");
        for (i=0; i<mapsize; i++) {
            printf("\n %d : %d", pMap[i].ch_num, pMap[i].sen_num);
        }

        pMap = GetMap();

        printf("\n Expected map1 :");
        for (i=0; i<mapsize; i++) {
            printf("\n %d : %d", pMap[i].ch_num, pMap[i].sen_num);
        }

    }

И вывод:

 Expected map1 (straight forward):
 2 : 3
 3 : 1
 1 : 4
 Expected map2 :
 1 : 1
 2 : 3
 4 : 2
 Expected map1 :  < -- this is what I want to fix. 
 1 : 1   <-- These are map2 values, Not Map1 :( 
 2 : 3
 4 : 2
 Expected map1 :
 2 : 3
 3 : 1
 1 : 4

Я в основном хочу переписать / исправить функцию UpdateMap так, чтобы она работала как GetMap, за исключением возврата. [Я все еще не могу иметь смысл].

Я хочу, чтобы функция вызывающего абонента определяла указатель карты * pMap (в данном случае main). Когда я передаю этот указатель карты в функцию (UpdateMap), функция UpdateMap обновляет значение указателя, чтобы указывать либо на map1, либо на map2. И что более важно, обновите ссылку на указатель карты, чтобы затем, когда основная функция использовала указатель карты, она указывала на карту, обновленную функцией UpdateMap.

В приведенном выше коде UpdateMap получает * pMap в качестве параметра функции, и его значение можно изменить для использования только внутри этой функции.

Ответы [ 2 ]

2 голосов
/ 20 марта 2020

В вашей функции UpdateMap:

void UpdateMap(struct ch_sen_map * map)
{
    map = map1;
}

Вы изменяете значение map, которое является локальным для функции, поэтому изменения в нем не видны за пределами функции. Вам нужно принять указатель на struct ch_sen_map *, то есть struct ch_sen_map **, и разыменовать этот указатель, чтобы изменить то, на что он указывает.

Поэтому измените свою функцию на:

void UpdateMap(struct ch_sen_map **map)
{
    *map = map1;
}

И назовите это так:

UpdateMap(&pMap);  
1 голос
/ 20 марта 2020

Если вы хотите обновить указатель, вам нужно передать указатель на этот указатель.

void UpdateMap(struct ch_sen_map ** map_ptr)
{
    *map_ptr = map1;
}

int main(void)
{

    struct ch_sen_map *pMap;

    UpdateMap(&pMap);
    // ...
}

Кстати, main всегда должен возвращать int.

...