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.


Anmelden zum Antworten