Forum: PC-Programmierung c qsort struct array


von sorter (Gast)


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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Da nur 5 Arrayelemente vorhanden sind:

Bau eine Debugausgabe in Deine Vergleichsfunktion ein.

Abgesehen davon ist es ausgesprochen ungeschickt, Deine Struktur als 
"time_t" zu bezeichnen, das ist ein in vielen Laufzeitumgebungen bereits 
existierender Datentyp.

von sorter (Gast)


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]

von sorter (Gast)


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

von PittyJ (Gast)


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.

von sorter (Gast)


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.

von spontan (Gast)


Lesenswert?

Deine geheime Lösung mag ja funktionieren. Schön, aber denk doch mal 
drüber nach wie PittyJ schon geschrieben hat: Alles kann man 
vereinfachen.

von Davis (Gast)


Lesenswert?

sorter schrieb:

> danke ich habs jetzt anders gelöst mit einem eigenen sortieralgorithmus,

Poste doch bitte deinen Algorithmus.

von Martin B. (Gast)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.