2016-09-16 5 views
0

몇 가지 C 문제를 해결해야하며 그 중 대부분은 qsort()를 어딘가에서 사용해야하는 것과 관련이 있습니다.하지만 인터넷에서 얼마나 많은 도움을 받든지 상관없이 작동시킬 수는 없습니다. 예를 들어,이 코드를 가지고 : 나는 날짜가 이미 경우에도 선언되지 않은 것입니다 오류가 발생할 수구조체 배열에서 작동하도록 qsort()를 구현하는 방법은 무엇입니까?

#include <stdio.h> 
#include <string.h> 
struct date 
{ 
    int day; 
    int month; 
    int year; 
};struct date d[5]={ 
    {12,12,2012}, 
    {23,02,2014}, 
    {31,01,2222}, 
    {32,21,2011}, 
    {12,01,1990} 
    }; 

int compare(const void * a, const void * b) 
{ 
    struct date *orderA = (date *)a; 
    struct date *orderB = (date *)b; 

    return ( orderA->year -orderB->year ); 
} 
int main() 
{ 
    int i; 
    qsort(d,5,sizeof(date),compare); 

    for(i=0;i<5;i++) 
    printf("%d %d %d\n",d[i].day,d[i].month,d[i].year); 
    return 0; 

} 

. 그리고 난 함수를 비교하는 것을 이해할 수없고 그물에서 복사해야합니다. 도와주세요, 제발. 대학의 선생님은 아주 사소합니다.

+2

'의를 sizeof을 (구조체 날짜)'도'#INCLUDE ' – Kninnug

+1

및 사용'구조체 날짜 * orderA = (구조체 날짜 *)는; '비교 함수에서. – Riley

+2

또는'typedef struct date date;를 사용하십시오. – BLUEPIXY

답변

0

사소한 문제 : 당신은 (qsort()에 대한) stdlib.h을 포함해야하지만, 당신은 당신의 예에서 string.h를 사용하지 않는; 당신은 구조체와 타입으로 date을 사용하지만 그것을 정의하지는 마십시오 - 당신은 typedef을 통해 동시에 둘 다 정의 할 수 있습니다; 원하는 경우 수년 간 비교를 확장 할 수 있습니다.

위의 문제 해결 코드의 재 :

#include <stdio.h> 
#include <stdlib.h> 

typedef struct date { 
    int day; 
    int month; 
    int year; 
} Date; 

int compare(const void *a, const void *b) { 
    const Date *date_A = a; 
    const Date *date_B = b; 

    return date_A->year == date_B->year ? 
     date_A->month == date_B->month ? 
      date_A->day - date_B->day 
       : date_A->month - date_B->month 
        : date_A->year - date_B->year; 
} 

int main() { 

    Date dates[] = { 
     {12, 12, 2012}, 
     {23, 02, 2014}, 
     {31, 01, 2222}, 
     {32, 21, 2011}, 
     {12, 01, 1990} 
    }; 

    size_t count = sizeof(dates)/sizeof(Date); 

    qsort(dates, count, sizeof(Date), compare); 

    for (int i = 0; i < count; i++) { 
     Date *date = &dates[i]; 
     printf("%d %d %d\n", date->day, date->month, date->year); 
    } 

    return 0; 
} 
1

date은 유형이 아닙니다. struct date입니다. 구조 유형을 참조 할 때 struct 키워드를 사용해야합니다.

또한 비교 함수에서 포인터를 const으로 정의하면 캐스트가 필요하지 않습니다. 코드와

const struct date *orderA = a; 
const struct date *orderB = b; 
+0

@overloood 기꺼이 도와 드리겠습니다. 도움이된다면이 대답을 받아 들일 수 있습니다. – dbush