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.
Мне просто интересно, есть ли способ улучшить эту работу? Или мне просто уйти с тем, что я сделал?
Большое спасибо за любые предложения,