Добавление элемента в структуру данных (C) - PullRequest
0 голосов
/ 19 октября 2018

Я работаю с библиотекой C-Collections, и у меня есть некоторые проблемы с HashSet.Скажем, я хочу добавить числа из цикла к набору следующим образом:

for (int j = 0; j < M; ++j) {
        if (Matrix[j][i] == 1) {
            int* key_I_want_to_add = &j;
            if(hashset_add(the_set, key_I_want_to_ad) != CC_OK)
                printf("error");
            else {
                printf("added tool %d to job %d -- ", tool, i);
                printf("size is now %d ", hashset_size(tools));
            }
        }
    }

Это добавляет адрес ключа к набору.Проблема в том, что в каждом цикле ключу присваивается один и тот же адрес, и он перезаписывает первый.Размер набора остается равным 1. Прототип функции добавления -

enum cc_stat hashset_add(HashSet *set, void *element);

Как мне действовать дальше?В настоящее время я изучаю C, это, вероятно, что-то тривиальное ...

Спасибо

Ответы [ 2 ]

0 голосов
/ 19 октября 2018

Вы просто добавляете указатель на локальную переменную j каждый раз.Ваша библиотека, вероятно, просто хранит указатели (поэтому в этом случае она каждый раз сохраняет один и тот же указатель на j. Вы можете либо динамически выделить новый int (что, вероятно, более правильно, но кажется расточительным с точки зрения памяти).и циклы) или просто приведите значение как void * указатель:

hashset_add(the_set, (void *)j);

Теперь, это то, что вы действительно хотите, хотя? Я не уверен, что вы действительно хотели хранить целые числа 0 ...М-1, потому что это то, что сделал бы этот код.

0 голосов
/ 19 октября 2018

Похоже, что эта реализация хэш-набора ожидает указатель на элемент для добавления.Причина, по которой у вас есть только 1 элемент в списке, заключается в том, что вы продолжаете передавать ему один и тот же адрес, то есть адрес j.Кроме того, после выхода из внешнего цикла for j выходит из области видимости, поэтому сохраненный указатель становится недействительным.

Вам потребуется динамически распределять память для каждого элемента, который вы хотите добавить:

        int *key_I_want_to_add = malloc(sizeof(int));
        *key_I_want_to_add = j;
        if(hashset_add(the_set, key_I_want_to_ad) != CC_OK)
            printf("error");

Не забудьте очистить эту память, когда закончите с использованием хэш-набора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...