2010-12-08 1 views
0
gcc 4.5.1 c89 

다른 사람의 코드를 유지 관리하고 있습니다. 그리고 그들은 헤더 파일의 구조를 노출시키지 않는 측면에서 실제로 것들을 잠갔습니다. 그들은 앞으로 이러한 데이터 구조를 선언했습니다. 응용 프로그램의 다른 부분에 영향을 줄 수 있으므로이 중 아무 것도 변경할 수 없습니다. 우리의 드라이버 파일에서앞으로 전달 된 구조에 액세스 할 수 있습니다.

나는 삽입 정렬을 사용하여 정렬 루틴을 만들어야했습니다. 투표 수에 따라 다릅니다. 나는 수정해야했던 relavent 조각의 코드 스 니펫을 보내고 있습니다.

typedef struct Candidates_t Candidates_t; 
int get_candidate_vote(const Candidates_t *candidate); 

나는 candidate.h 파일을 포함 드라이버 파일에서 다음은

후보 구현 파일 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이입니다. 그런 다음 cand_data 구조에 생성 된 모든 Candiate를 저장합니다.

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

+0

@lijie와 (과) 일치합니다. 이것은 좋은 깨끗한 방법이며, 여러분이나 다른 누군가가 나중에 get_candidate_vote를 더 많이 사용할 수 있습니다. 하나의 사소한 변화를 고려해보십시오. 배열에서 삽입 위치를 찾고 구조체를 한 번에 하나씩 이동하지 않고'memmove'를 한 번 사용하십시오. – aschepler

+0

@lije. 어쩌면, 네 말이 맞아. 다른 아이디어를 얻기 위해 나는 뛰고 있었다. 나는 좀 더 오래 기다리고 싶다. 누군가는 내가 생각하지 못했던 어떤 것을 생각해 낸다. @aschelper, 내가 너무 memmove를 사용할 수있는 방법을 이해하지, 당신은 짧은 예제를 줄 수 있습니다. 감사. – ant2009

답변

1

이 작업을 수행하는 일반적인 방법은 직접 "게터을"수출보다는, 두 Candidate들과 비교하는 비교 기능을 내보내는 것입니다. 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() 정렬.

+0

고마워요, 카프, 그게 내가 찾는 조언이야. 나는 항상 너를 믿을 수있다. 감사. – ant2009

1

당신은 구조체를 정의하고 필요한 소스 파일이 공유 "candidate_internal.h"를 만들 수 있습니다.

+0

예, 저는 다른 솔루션 중 하나에서 그렇게했습니다. 나는 candidate_private.h라고 불렀다. 감사. – ant2009

관련 문제