Struktur sortieren?



  • Die Zugehörigkeit der Daten bleibt bei den Strukturvariablen erhalten, lediglich die Aressen werden umkopiert.

    Vorher:
    Gundula Schnattermeier 123
    Brunhilde Olsebolse 456

    Nachher:
    Brunhilde Olsebolse 456
    Gundula Schnattermeier 123

    Die memset-Funktion initialisiert alle Strukturvariablen mit 0 damit da kein Schrott drin steht.



  • Ah ok. Muss wohl noch bischen testen da er die Strukturdaten nach dem sortieren in eine txt datei zeilenweise schreibt und derzeit nur 0en drin stehen wenn ich vor dem schreiben in die txt Datei sortiere.
    Und ich bekomm noch die Meldung:

    [Warning] passing arg 4 of `qsort' from incompatible pointer type

    EDIT: Hab den Fehler selber schon gesehen. size_t num war bei mir größer als es eigentlich ist 🙂
    Danke nochmal



  • Bei mir meckert der Compiler nicht.
    Möglicherweise hast du bei deinem eine andere Einstellung ?
    ( Aufrufkonvention )



  • qsort() erwartet ja auch eine Funktion, die zwei void* übernimmt und keine 'struct Kunde*'. Korrekt sieht die compare()-Funktion so aus:

    int compare(const void* p1, const void* p2 )
    {
       struct Kunde *k1=p1,*k2=p2;
       return strcmp( k1->Name, k2->Name );
    }
    


  • Ich hab mal noch ne Frage die Bezug auf die Sortierfunktion nimmt.
    Ich habe ja jetzt eine sortierte Struktur wie z.B.
    Hans 123
    Meier 789
    Schulze 456

    Nun hab ich bei meinen Programm auch die Möglichkeit einen Namen (inkl seiner Daten) zu "löschen". Das hab ich bei mir so gemacht das er die Struktur verläuft und wenn er den Namen findet das macht:

    for (schleifenzaehlersuche = 0; schleifenzaehlersuche < 20; schleifenzaehlersuche++)
        {
            if (strcmp(Kundenadressen[schleifenzaehlersuche].firmenname,Suchfirmenname) == 0)
            {
                printf("\nDaten der Person wurden geloescht\n");
    
                strcpy(Kundenadressen[schleifenzaehlersuche].name, "");
                strcpy(Kundenadressen[schleifenzaehlersuche].wohnort, "");
                Kundenadressen[schleifenzaehlersuche].postleitzahl = 0;
                Kundenadressen[schleifenzaehlersuche].postfach = 0;
                Kundenadressen[schleifenzaehlersuche].telefonnummer = 0;
    
                sortieren(); //Sortieren
                break;
            }
    
        }
    

    Nach dem der Kunde entfernt wurde soll also wieder sortiert werden so das der leere Bereich ganz unten steht. Bei mir macht er das auch wenn ich den letzten "lösche" (siehe Beispiel oben: Schulze). Wenn ich aber z.B. Meier "lösche" dann "löscht" er auch gleichzeitig Schulze. Weiss jemand ob das dann am sortieren liegt oder an der Art wie ich den Kunden entferne?



  • Hab mal einfach nicht das gemacht "" sondern was reingeschrieben "TEST" und dann klappt das komischweise mit dem entfernen. Kann mir das zwar nicht erklären aber es funktioniert.



  • Vermutlich liegt's an biedem - der leere String (und damit auch dein gelöschter Datensatz) landet afaik ganz vorne in der Sortierung.



  • HI ! 🕶

    Ich würde die Struktur "richtig" löschen, dann brauchst du dir keinen Kopf um leere Strukturen zu machen.

    Im Übrigen würde ich eine Nummer ( IDs ) für jeden Kunden vergeben. So wie es die Datenbanken machen.
    Sonst kommt es früher oder später zu Namenskonflikten, nämlich wenn du zwei Meier in der Kundendatei hast. 😉 🙂



  • Habs jetzt so gemacht das ich alle Kunden unter der gelöschten eins nach oben geschoben habe und die gesamtkundengröße um 1 verringert. Klappt auch super 🙂



  • 👍


Anmelden zum Antworten