gcc 4.5.1 c89
我正在维护某人的代码。并且它们在不暴露头文件中的结构方面确实被锁定了。他们已经向前宣布了这些数据结构。我无法更改其中的任何内容,因为它会影响应用程序的其他部分。
在我们的驱动程序文件中,我必须使用插入排序创建一个排序例程。这取决于投票数。我只是发送了我必须修改的相关部分的代码片段。
这是候选实施文件candidate.c
struct Candidates_t {
int id;
char *name;
size_t votes;
};
int get_candidate_vote(const Candidates_t *candidates)
{
return candidates->votes;
}
这是候选头文件candidate.h:
typedef struct Candidates_t Candidates_t;
int get_candidate_vote(const Candidates_t *candidate);
在驱动程序文件中,我包含了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;
}
然而,为了使上述排序例程起作用,我必须创建getter函数以使每个投票进行比较。
我希望创建更多抽象并将数组传递给candidate.c文件中的排序例程以返回排序数组。但是,candidate.c文件不知道driver.c文件中的结构。
我只是想知道是否有任何方法可以让这项工作更好?或者我应该离开我所做的事情?
非常感谢任何建议,
答案 0 :(得分:1)
您可以创建定义结构的"candidate_internal.h"
,并由需要它的源文件共享。
答案 1 :(得分:1)
执行此操作的常用方法是导出比较两个Candidate
的比较函数,而不是直接导出“getter”。在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;
}
请注意,“驱动程序”文件现在不必了解“候选”的内部信息 - 它只是一个通用的插入排序,它们排序的顺序完全由{{ 1}}文件。
作为进一步的改进,您应该考虑使用C库的内置排序函数candidate.c
。