2010-12-08 16 views
0
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文件中的結構。

我只是想知道是否有任何方法使這項工作更好?或者我應該離開我所做的事情?

非常感謝您的任何建議,

+0

如果Candidates_t確實需要封裝其內容,您的解決方案實際上聽起來像是正確的解決方案。 – lijie 2010-12-08 15:42:20

+0

同意@lijie。這是一個很好的乾淨的方式來做到這一點,你或其他人以後可能會找到`get_candidate_vote`的更多用途。你可能要考慮的一些小改變:在數組中找到插入位置並且使用`memmove`而不是一次移動一個結構。 – aschepler 2010-12-08 15:49:33

+0

@lije。也許,你的權利。我正在跳躍以獲得其他想法。我想等一會兒,如果有人想出了一些我沒有想過的東西。 @aschelper,不太確定我明白我可以如何使用memmove,你可以舉個簡單的例子。謝謝。 – ant2009 2010-12-08 15:51:54

回答

1

通常的做法是輸出一個比較函數比較兩個Candidate s,而不是直接導出一個「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; 
} 

注意「驅動程序」文件現在不必知道一個「候選」的內部任何東西 - 它只是一個通用插入排序,它們排序的順序完全由candidate.c文件定義。

作爲進一步的改進,您應該考慮使用C庫的內置排序功能qsort()

1

您可以創建"candidate_internal.h"定義結構,並通過需要它的源文件共享。