2016-09-16 4 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

関連する問題