получение доступа к заранее объявленным структурам - PullRequest
0 голосов
/ 08 декабря 2010
gcc 4.5.1 c89

Я поддерживаю чей-то код. И у них есть вещи, действительно заблокированные с точки зрения того, чтобы не показывать структуры в заголовочных файлах. Они заранее объявили эти структуры данных. Я не могу изменить ни один из них, так как это повлияет на другие части приложения.

В нашем файле драйвера мне нужно было создать процедуру сортировки, используя сортировку вставкой. Это сортирует по количеству голосов. Я просто отправляю фрагменты кода соответствующих частей, которые мне пришлось изменить.

Вот файл-кандидат для реализации кандидат.c

struct Candidates_t {
    int id;
    char *name;
    size_t votes;
};

int get_candidate_vote(const Candidates_t *candidates)
{
    return candidates->votes;
}

Вот заголовочный файл-кандидат candid.h:

typedef struct Candidates_t Candidates_t;
int get_candidate_vote(const Candidates_t *candidate);

В файле драйвера я включаю файл кандидат.h. Затем я сохраняю все созданные конфеты в структуре cand_data.

typedef struct Candidate_data_t {
    size_t candidate_data_id;
    Candidates_t *candidate;
    size_t votes;
} Candidate_data;

Candidate_data *cand_data[NUMBER_OF_CANDIDATES] = {0};
/* This runs in a for loop */
cand_data[i] = create_candidate_data(candidate, i);

for(j = 1; j < NUMBER_OF_CANDIDATES; j++) {
    temp_cand_data = cand_data[j];
    k = j - 1;

    /* Get the votes to compare */
    vote_temp = get_candidate_vote(temp_cand_data->candidate);
    vote_cand = get_candidate_vote(cand_data[k]->candidate);

    while(k >= 0 && vote_temp < vote_cand) {
        cand_data[k + 1] = cand_data[k];
        vote_cand = get_candidate_vote(cand_data[k]->candidate);
        k = k - 1;
    }
    cand_data[k + 1] = temp_cand_data;
}

Однако, чтобы описанная выше процедура сортировки работала, мне пришлось создать функцию получения, чтобы каждый голос сравнивался.

Я надеялся создать больше абстракции и передать массив подпрограмме сортировки в файле кандидат.с, чтобы вернуть отсортированный массив. Однако файл кандидат.c не знает структуры в файле driver.c.

Мне просто интересно, есть ли способ улучшить эту работу? Или мне просто уйти с тем, что я сделал?

Большое спасибо за любые предложения,

Ответы [ 2 ]

1 голос
/ 09 декабря 2010

Обычный способ сделать это - экспортировать функцию сравнение , которая сравнивает два Candidate с, а не напрямую экспортировать «получатель». В candidate.c:

/* Returns 1 if `a` is greater than `b`, otherwise 0 */
int compare_candidates(const Candidates_t *a, const Candidates_t *b)
{
    return a->votes > b->votes;
}

Затем в файле драйвера:

for(j = 1; j < NUMBER_OF_CANDIDATES; j++) {
    temp_cand_data = cand_data[j];
    k = j - 1;

    while(k >= 0 && compare_candidates(cand_data[k]->candidate, temp_cand_data->candidate)) {
        cand_data[k + 1] = cand_data[k];
        k = k - 1;
    }
    cand_data[k + 1] = temp_cand_data;
}

Обратите внимание, что файл "драйвера" теперь не должен ничего знать о внутренностях "кандидата" - это просто общая сортировка вставки, и порядок их сортировки полностью определяется candidate.c файл.

В качестве дальнейшего уточнения вы должны рассмотреть использование встроенной функции сортировки библиотеки C, qsort().

1 голос
/ 08 декабря 2010

Вы можете создать "candidate_internal.h", который определяет структуру и является общим для исходных файлов, которым она необходима.

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