C11: Konstanter Pointer auf Array -- lvalue-Problem



  • void bubbleSort(uint64_t const *array[], const size_t length) {
        size_t unsortedUntilIndex = length - 1;
        bool isSorted = false;
    
        while (!isSorted) {
            isSorted = true;
            for (size_t i = 0; i < unsortedUntilIndex; ++i) {
                if ((*array)[i] > (*array)[i + 1]) {
                    isSorted = false;
                    // Swap
                    uint64_t tmp = (*array)[i];
                    (*array)[i] = (*array)[i + 1];
                    (*array)[i + 1] = tmp;
                }
            } // end of loop for
             // last element has "bubbled up", thus it is sorted & it can be ignored
            unsortedUntilIndex -= 1;
        } // end of loop while
    }
    

    Zeile 12 und 13 sind Fehlerhaft, da es ein modifizierbares "lvalue" sein muss und ich aber einen konstanten Pointer auf ein Array haben will. Wie mache ich das, sodass es ein konstanter Pointer bleibt, aber dieses "lvalue"-Problem sich löst?

    Warum ich einen konstanten Pointer möchte? Ist es nicht gute Programmierpraxis die Parameterliste konstant zu halten?



  • Hier ist nirgendwo ein Array.
    const-correctness Fetischist?
    Du willst von einer Funktion ein Objekt sortieren=verändern lassen, deklarierst dafür die Signatur als const und beschwerst dich dann?
    Für length const zu deklarieren ist ebenso sinnfrei.



  • ^
    Moin,

    "const-correctness Fetischist"? Jo, so habe ich das halt gelernt... 🤡

    Ja, das Array will ich sortieren, aber der Pointer der auf das Array zeigt ist konstant (darf nicht ir'wie verändert werden = Sicherheit), nicht aber das Array selbst. D.h., dass ich auf den Inhalt des Pointers zugreife, nämlich das Array selbst und dann sortiere ich es. Müsste doch gehen!?

    Wenn es uint64_t const *array wäre, dann kann ich nichts ändern, aber wenn es uint64_t const **array bzw. uint64_t const *array[], dann kann ich den Inhalt ändern.

    Falsch/richtig?



  • Oh, halt... Jetzt fällt mir 'was ein:

    Es müsste uint64_t * const *array sein, denn von rechts nach links gelesen heisst das: konstanter Pointer auf ein anderen Pointer (das Array)...

    Warum ist das mit const size_t length sinnfrei?

    Ich glaub' ich habe meine Antwort selbt gefunden... oder?



  • iceyu schrieb:

    Warum ist das mit const size_t length sinnfrei?

    weil du bei length "call by value" machst und daher auf const verzichten kannst. bei array ist das übrigens auch so bzw. du brauchst auch keinen zeiger auf das array übergeben.


Anmelden zum Antworten