Zeigerarrays sortieren?



  • Hallo zusammen.
    Wieso vertauscht der folgende Code nicht die Elemente im Zeigervektor?

    bool sortiert;
    	MobilePhone* ptrtemp = NULL;
    	do
    	{
    		sortiert = false;
    
    		for (int i = 0; i < 3 ; i++)
    		{
    			if (ptrListe[i]->get_owner() > ptrListe[i + 1]->get_owner())
    			{
    
    				ptrtemp = ptrListe[i + 1];
    				ptrListe[i + 1] = ptrListe[i];
    				ptrListe[i] = ptrtemp;
    
    				sortiert = true;
    			}
    		}
    
    	} while (sortiert == true);
    

    Die Elemente auf die die Zeiger verweisen sollen nicht geändert werden, lediglich die Anordnung der Zeiger anhand der Größe eines Strings. 😕



  • Abgesehen davon, dass du gefahr läufst in ein Segfault zu laufen betrachtest du immer nur dir ersten vier Elemente. Deine do-while Schleife hat so keinen Mehrwert.



  • Es sind auch nur vier Elemente im Array.

    Was ist ein Segfault? 😕



  • Feldscher schrieb:

    Hallo zusammen.
    Wieso vertauscht der folgende Code nicht die Elemente im Zeigervektor?

    Evtl sortierst Du eine Kopie Deines Arrays. Oder sortierst das richtige Array und schaust Dir danach das richtige an?
    Zusätzlich sortierst Du auch nicht ordentlich.

    Zeig mal die ganze Funktion. Siehe hier:
    Wie man Probleme nachstellbar und nachvollziehbar macht



  • Ich nehme an, es handelt sich immer noch um dasselbe Problem wie in deinem letzten Post.

    Wenn ich weiter mit Zahlen hantiere, sieht der Code so aus:

    #include <iostream>
    
    using namespace std;
    
    void sort(int* Liste[], size_t len)
    {
        bool reihenfolgeGeaendert;
        do {
            reihenfolgeGeaendert = false;
            for (size_t i = 1; i < len; i++) {
                if (*Liste[i - 1] > *Liste[i]) {
                    swap(Liste[i - 1], Liste[i]);
                    reihenfolgeGeaendert = true;
                }
            }
        } while (reihenfolgeGeaendert);
    }
    
    int main() {
        int Liste1[] = { 10,70,30,50,60 };
        constexpr auto listLen = sizeof(Liste1) / sizeof(Liste1[0]);
        int* ptrListe1[listLen];
        for (size_t i = 0; i < listLen; i++) {
            ptrListe1[i] = &Liste1[i];
        }
    
        sort(ptrListe1, listLen);
    
        cout << "Original: ";
        for (auto i : Liste1) {
            cout << i << " ";
        }
        cout << "\nVia Ptr:  ";
        for (auto i : ptrListe1) {
            cout << *i << " ";
        }
        cout << "\n";
    }
    

    Ich habe mir folgende Änderungen erlaubt:
    - übergeben der Länge an die sort-Funktion
    - umbenennen von "sortiert" in "reihenfolgeGeaendert". Denn solange dein "sortiert" true war, war ja gerade nicht sichergestellt, dass das Bubblesort fertig ist. Daher besser: solange noch irgendwas geändert wird, Schleife wiederholen. Könnte sein, dass dieser Name zu dem Missverständnis beigetragen hat, dass diese Schleife "keinen Mehrwert hat" (-> Schlangenmensch).
    - das sort nimmt nun einen int** entgegen
    - dein händisches swap durch swap ersetzt
    - und wie du siehst, kommt nirgends explizit die Array-Länge mehr vor. Also keine magische "3", "4" oder "5" im Sourcecode!
    - und deine schleife von 0 bis excl. i-1 habe ich auf 1 bis < i geändert, somit funktioniert das sort nämlich auch für leere Listen (weil wegen size ist unsigned, somit sollte man von 0 besser nicht 1 abziehen).
    - und überlege dir, ob du wirklich nicht lieber std::sort nehmen willst



  • Feldscher schrieb:

    Was ist ein Segfault? 😕

    Wenn du es nicht schaffst, sowas zu googlen, solltest du das mit dem Programmieren doch lassen.



  • wob schrieb:

    - umbenennen von "sortiert" in "reihenfolgeGeaendert". Denn solange dein "sortiert" true war, war ja gerade nicht sichergestellt, dass das Bubblesort fertig ist. Daher besser: solange noch irgendwas geändert wird, Schleife wiederholen. Könnte sein, dass dieser Name zu dem Missverständnis beigetragen hat, dass diese Schleife "keinen Mehrwert hat" (-> Schlangenmensch).

    Jup, da bin ich drauf rein gefallen



  • dachschaden schrieb:

    Feldscher schrieb:

    Was ist ein Segfault? 😕

    Wenn du es nicht schaffst, sowas zu googlen, solltest du das mit dem Programmieren doch lassen.

    Danke für diesen konstruktiven und äußerst hilfreichen Beitrag. 👍



  • wob schrieb:

    Ich nehme an, es handelt sich immer noch um dasselbe Problem wie in deinem letzten Post.

    ...

    Ja, etwas erweitert bzw. abgewandelt.
    Ich schau mir deine Verbesserungen jetzt mal in Ruhe an und versuche das nachzuvollziehen.
    Generell mache ich noch viele Sachen komplizierter als sie eigentlich sein müssten oder ich limitiere an Stellen wo es nicht sinnvoll ist(wie bei der Länge), aber das wird langsam.

    Danke dir schonmal 🙂



  • Feldscher schrieb:

    Danke für diesen konstruktiven und äußerst hilfreichen Beitrag. 👍

    Wenn man beachtet, dass du nicht einmal diesen Thread gelesen hast:

    pumuckl schrieb:

    Bemühe Bücher, Tutorials, Dokumentationen, Referenzen und Suchmaschinen bevor du fragst. Jemand der offenbar einfach zu faul ist um kurz nach ein oder zwei Stichworten zu googlen erntet schnell den Unmut der anderen Forenuser oder wird gleich ignoriert. Zeig was du selber geleistet hast, dann wird dir auch weitergeholfen.

    dann bin ich noch äußerst hilfreich, indem ich dich nicht ignoriere.
    inb4 das kann man auch höflich sagen - genau das habe ich getan. Ich habe dir höflich gesagt, dass wenn du nicht auf den Gedanken kommst, das weite Internet zu nutzen, um dein Wissen zu erweitern, du in der Programmiererei nichts verloren hast.



  • Feldscher schrieb:

    Was ist ein Segfault? 😕

    Um das hier trotzdem noch zu klären: Segfault ist eine kurz Schreibweise für Segmentation Fault. Also ein Speicherzugriffsfehler.

    Aus dem Code den du gepostet hast, geht nicht hervor, dass es sich um ein Array der Länge 4 handelt. Wenn das Array kürzer ist, schreibst du in Speicher der dir nicht gehört => Speicherzugriffsfehler => Programmabsturz.
    Ein bisschen kritischer ist vlt. noch lesender Zugriff auf solche Stellen, denn dann stürzt dir das Programm im Zweifel nicht ab, aber es verhält sich dann auch nicht so, wie du es erwartest, da an den Stellen irgendwas im Speicher stehen kann.

    Prinzipiell würde ich dir stark dazu raten, die Länge des Arrays festzuhalten und dann solange wie Laufvariable < Länge zu iterieren und niemals Laufvariable+1 zu verwenden. Sondern wie in wobs Beispiel, mit i=1 anfangen und mit i-1 auf das vorherige Element zugreifen.


Anmelden zum Antworten