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 파일의 구조를 알지 못합니다.난 그냥 더 나은이 작품을 만드는이 경우 어떤 방법을 궁금? 아니면 제가 한 일을 그냥 맡겨야합니까? 어떤 제안에 대한
많은 감사,
실제로 Candidates_t가 내용을 캡슐화해야하는 경우 솔루션이 실제로 올바른 것으로 들립니다. – lijie
@lijie와 (과) 일치합니다. 이것은 좋은 깨끗한 방법이며, 여러분이나 다른 누군가가 나중에 get_candidate_vote를 더 많이 사용할 수 있습니다. 하나의 사소한 변화를 고려해보십시오. 배열에서 삽입 위치를 찾고 구조체를 한 번에 하나씩 이동하지 않고'memmove'를 한 번 사용하십시오. – aschepler
@lije. 어쩌면, 네 말이 맞아. 다른 아이디어를 얻기 위해 나는 뛰고 있었다. 나는 좀 더 오래 기다리고 싶다. 누군가는 내가 생각하지 못했던 어떤 것을 생각해 낸다. @aschelper, 내가 너무 memmove를 사용할 수있는 방법을 이해하지, 당신은 짧은 예제를 줄 수 있습니다. 감사. – ant2009