struct Eigenschaften vertauschen
-
Hi,
ich habe folgendes struct:
typedef struct vehicle CAR; struct vehicle { char Hersteller[99]; char Modell[99]; // hier Attribute einfuegen unsigned int vMax; };
Nun möchte ich die Hersteller sortieren, dazu habe ich folgendes programmiert:
void SortList(CAR *MeineAutoListe, int *Anzahl) { int vertauscht = 0; int p = 4; int i; for (p=4; p==1; p--) { for (i=1; i < n; i++) { if (MeineAutoListe[i].Hersteller[0] > MeineAutoListe[i+1].Hersteller[0]) { // hier sind Fehlermeldungen MeineAutoListe[98].Hersteller = MeineAutoListe[i].Hersteller; MeineAutoListe[i].Hersteller = MeineAutoListe[i+1].Hersteller; MeineAutoListe[i+1].Hersteller = MeineAutoListe[98].Hersteller; } } } for (i=0; i<=p; i++) { printf("%s - %s, %dkm/h\n", MeineAutoListe[i].Hersteller, MeineAutoListe[i].Modell, MeineAutoListe[i].vMax); } } // .... // main SortList(MeineAutoListe, &Anzahl);
die Fehlermeldung besagt, dass die Typen inkompaktibel sind..
Wäre um jeden Rat dankbar
-
Wenn du mit Zeichenketten arbeitest (char), dann schau dir mal die beiden Funktionen
- strcmp (zum vergleichen von Zeichenketten)
- strcpy (zu kopieren von Zeichenketten)genauer an.
> strcmp(MeineAutoListe[i].Hersteller, MeineAutoListe[i+1].Hersteller);
> strcpy(MeineAutoListe[i].Hersteller, MeineAutoListe[i+1].Hersteller);Die Rückgabewerte von strcmp findest du selber heraus
-
Die richtige Kenntnis und Verwendung von Bubblesort und Struktur-Kopien hilft hier doch sehr:
void SortList(CAR *MeineAutoListe, int *Anzahl) { int i, vertauscht = 1; while( vertauscht ) { vertauscht=0; for(i=0;i<*Anzahl-1;++i) if( strcmp(MeineAutoListe[i].Hersteller, MeineAutoListe[i+1].Hersteller)>0 ) { CAR temp=MeineAutoListe[i]; MeineAutoListe[i]=MeineAutoListe[i+1]; MeineAutoListe[i+1]=temp; vertauscht=1; } } for (i=0; i<*Anzahl; i++) { printf("%s - %s, %dkm/h\n", MeineAutoListe[i].Hersteller, MeineAutoListe[i].Modell, MeineAutoListe[i].vMax); } }
-
Die richtige Kenntnis und Verwendung von den GNU-Extensions und Struktur-Design hilft hier doch sehr:
typedef struct vehicle { char * producer; char * model; unsigned max_speed; } vehicle; static int vehicle_cmp (const vehicle *c1, const vehicle *c2) { return strcmp (c1->name, c2->name); } void sort_list (vehicle *vehicles, size_t count) { qsort (vehicles, count, sizeof (*vehicles), vehicle_cmp); } inline void print_vehicle (vehicle *v) { printf ("%s - %s, %dkm/h\n", v->producer , v->model , v->max_speed ); } void print_list (vehicle *vehicles, size_t count) { for (; count; ++vehicles, --count) print_vehicle (vehicles); }
(ungetestet)
-
inline void
ist nicht C, daher musst du es durch
void
ersetzten.
-
qsort
ist auch nicht in der Standard C Bibliothek enthalten.
Aber wie sagte ich so schön:... schrieb:
Die richtige Kenntnis und Verwendung von den GNU-Extensions
Dazu gehört halt auch inline, übrigens seit über einer Dekade in C99 enthalten.
Wenn's dich stört, dann kannst du es ja rausnehmen, um portabel zu bleiben definiere ich das normalerweise, bei fehlender Unterstützung durch den Compiler, als leeres Makro.