获得前向声明的结构

时间:2010-12-08 15:34:52

标签: c

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文件中的结构。

我只是想知道是否有任何方法可以让这项工作更好?或者我应该离开我所做的事情?

非常感谢任何建议,

2 个答案:

答案 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