c qsort struct array

Gast #3266531
Lesenswert?

hi,

ich steh gerade etwas auf dem schlauch. ich versuche mein array zu 
sortieren mit qsort abhängig von einem rtc timestamp. es soll 
aufsteigend nach dem jüngsten datum sortiert werden also: z.b. time_1 = 
10.05.2013 15:10:44   und time_2 = 10.05.2013 15:01:34 dann müsste 
time_2 in das element [0] geschrieben werden und time_2 in element [1] 
usw..
1
 
2
typedef struct RTC_TYPE
3
{
4
  uint8_t  day;
5
  uint8_t  month;
6
  uint16_t year;
7
  uint8_t  hour;
8
  uint8_t  min;
9
  uint8_t  sec;
10
}rtc_t;
11

12
typedef struct TIME_TYPE
13
{
14
  uint8_t id;
15
  rtc_t   time_stamp;
16
}time_t;
17

18
time_t array[5];
19

20

21
int rtc_cmp(const void* time_1, const void* time_2)
22
{
23
   time_t *p1 = (time_t *) time_1;
24
   time_t *p2 = (time_t *) time_2;
25

26
   if(p1->time_stamp.year < p2->time_stamp.year)
27
   {
28
      return -1;
29
   }
30
   else if(p1->time_stamp.year > p2->time_stamp.year)
31
   {
32
      return  1;
33
   }
34

35
   if(p1->time_stamp.month < p2->time_stamp.month)
36
   {
37
      return -1;
38
   }
39
   else if(p1->time_stamp.month > p2->time_stamp.month)
40
   {
41
      return  1;
42
   }
43

44
   if(p1->time_stamp.day < p2->time_stamp.day)
45
   {
46
      return -1;
47
   }
48
   else if(p1->time_stamp.day > p2->time_stamp.day)
49
   {
50
      return  1;
51
   }
52

53
   if(p1->time_stamp.hour < p2->time_stamp.hour)
54
   {
55
      return -1;
56
   }
57
   else if(p1->time_stamp.hour > p2->time_stamp.hour)
58
   {
59
      return  1;
60
   }
61

62
   if(p1->time_stamp.min < p2->time_stamp.min)
63
   {
64
      return -1;
65
   }
66
   else if(p1->time_stamp.min > p2->time_stamp.min)
67
   {
68
      return  1;
69
   }
70

71
   if(p1->time_stamp.sec < p2->time_stamp.sec)
72
   {
73
      return -1;
74
   }
75
   else if(p1->time_stamp.sec > p2->time_stamp.sec)
76
   {
77
      return  1;
78
   }
79

80
  return 0;
81
}
82

83

84
int main(void)
85
{
86
   //gehen wir mal davon aus das das array bereits mit verschiedenen timestamps befüllt wurde
87
   ....
88
   qsort(array, 5, sizeof(time_t), rtc_cmp); 
89

90
}

es wird sortiert jedoch vollkommen falsch und durcheinander, weiß jemand 
wo ein fehler liegt? danke im voraus
Gast #3266556
Lesenswert?

time_t hab ich es nur hier genannt um schnell fertig zu werden mit dem 
tippen.

in der jetzigen form passiert folgendes, z.b. 3 timestamps:

1.) 03.08.2013 11:05:00

2.) 03.08.2013 11:08:00

3.) 03.08.2013 15:08:00

und die anderen beiden elemente sind leer d.h. noch nichts 
reingeschrieben.

nach qsort steht 3.) im element [0] und 1.) steht im element [3] und 2.) 
im element [4]
Gast #3266594
Lesenswert?

ich bin ziemlich sicher das der zugriff in der rtc_cmp schiefgeht also 
dieser zugriff von der übergebenen struct auf eine andere. wenn ich das 
ganze durchspiele mit einem array von rtc_t funktioniert es. doch wie 
sollte ich sonst darauf zugreifen? ich nehme dann das qsort mit 2 
referenzen auf 2 elemente von time_t die rtc_cmp aufruft mithilfe dieser 
referenz will ich dann auf die jeweiligen elemente time_stamp zugreifen 
und danach sortieren
Gast #3266694
Lesenswert?

Mein Tip: benutzte intern nie so komplizierte Datumsstrukturen, sonden 
nehme den richtigen time_t (Sekunden seit 1970), meinetwegen auch den 
MS-Type Sekunden seit 1900.
Das ist es letztendlich nur eine Zahl, sie belegt weniger Speicher und 
damit kann wunderbar gerechnet und verglichen werden.
Nur für die Benutzer Aus- und Eingabe wird dann auch Tage, Stunden... 
umgerechnet. Dafür gibt es Bibliotheksfunktionen.

Dein Quicksortvergleich wäre ein einfaches > gewesen.
Gast #3266709
Lesenswert?

hi,

danke ich habs jetzt anders gelöst mit einem eigenen sortieralgorithmus, 
da kann ich wenigstens debuggen, in die standard biblioth. funktionen 
kann ich net reinsehen. der grund für die zweite struct war einfach um 
zuätzliche einfügen zu können die ich brauche, aber es sollte eben nur 
abhängig von der rtc timestamp sortiert werden und das habe ich wie 
gesagt nun mit einem eigenen sortieralgorithmus gemacht.
Gast #3266924
Lesenswert?

Überprüf mal Deine Testdaten.

Deine Funktion rtc_cmp ist richtig. Der qsort-Aufruf auch. Wenn in die 
beiden Elemente noch nichts reingeschrieben wurde, sind sie nicht 
notwendigerweise "leer" und wurden deshalb an die Positionen 1 und 2 
sortiert. Die 3 anderen Elemente müssten aber richtig sortiert werden.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren