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);
在驅動程序文件I包括candidate.h文件。然後,我將所有創建的candiate存儲到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文件中的結構。
我只是想知道是否有任何方法使這項工作更好?或者我應該離開我所做的事情?
非常感謝您的任何建議,
如果Candidates_t確實需要封裝其內容,您的解決方案實際上聽起來像是正確的解決方案。 – lijie 2010-12-08 15:42:20
同意@lijie。這是一個很好的乾淨的方式來做到這一點,你或其他人以後可能會找到`get_candidate_vote`的更多用途。你可能要考慮的一些小改變:在數組中找到插入位置並且使用`memmove`而不是一次移動一個結構。 – aschepler 2010-12-08 15:49:33
@lije。也許,你的權利。我正在跳躍以獲得其他想法。我想等一會兒,如果有人想出了一些我沒有想過的東西。 @aschelper,不太確定我明白我可以如何使用memmove,你可以舉個簡單的例子。謝謝。 – ant2009 2010-12-08 15:51:54