Arrays in Funktionen vergrößern ohne explizite Rückgabe



  • Hallo ihr Leut,
    ich möchte ein Array vergrößern, hier verdoppeln und Inhalte spiegeln.

    Mit expiliziter Rückgabe des Zeigers geht's natürlich (siehe auskommentierter Code). Warum geht's anders nicht, stehe gerade auf'm Schlauch 😕

    Code ist in Qt erstellt, müsste aber für das Problem belanglos sein.

    typedef QString datatype;
    
    /*
    datatype* arrayDoppeln(datatype array[], int &anz)
    {
        int laenge = anz;
        anz *= 2;
        datatype* kopie = new datatype[anz];
        for (int i=0; i<laenge; i++){
            kopie[i] = array[i];
            kopie[anz-i-1] = array[i];
        }
        delete[] array;
        return kopie;
    }
    */
    
    void arrayDoppeln(datatype *array, int &anz)
    {
        int laenge = anz;
        anz *= 2;
        datatype* kopie = new datatype[anz];
        for (int i=0; i<laenge; i++){
            kopie[i] = array[i];
            kopie[anz-i-1] = array[i];
        }
        delete[] array;
        array = kopie;
    }
    
    FrmMain::FrmMain(QWidget *parent) :
        QWidget(parent),
        ui(new Ui::FrmMain)
    {
        //Test bei Programmstart
        ui->setupUi(this);
    
        int max = 3;
        datatype* feld = new datatype[max];
        feld[0] = "a";
        feld[1] = "b";
        feld[2] = "c";
    
    //    feld = arrayDoppeln(feld,max);
        arrayDoppeln(feld,max);
    
        for (int i=0;i<max; i++) {
            ui->listWidget->addItem(feld[i]);
        }
    }
    


  • Benutze std::vector



  • manni66 schrieb:

    Benutze std::vector

    Vielen Dank für die Antwort. Dass das mit Vectoren geht, ist mir schon klar. Ebenso, dass das Ressourcen kostet 😉

    Ich möchte gerne wissen, warum es mit Zeigern nicht geht.



  • cppAndMe schrieb:

    Ich möchte gerne wissen, warum es mit Zeigern nicht geht.

    Weil du es falsch machst. Überlege mal, in welchem Gültigkeitsbereich dein array -Zeiger lebt.

    Benutze std::vector.


  • Mod

    cppAndMe schrieb:

    manni66 schrieb:

    Benutze std::vector

    Vielen Dank für die Antwort. Dass das mit Vectoren geht, ist mir schon klar. Ebenso, dass das Ressourcen kostet 😉

    Welche denn? Vector ist bloß ein Zeiger wie der, den du benutzen möchtest. Bloß dass er fix und fertig mit funktionierendem Code kommt (der dann auch garantiert effizienter ist als dein derzeitiger Versuch).

    Ich möchte gerne wissen, warum es mit Zeigern nicht geht.

    Weil du dafür effektiv std::vector nachprogrammieren musst, aber nicht einmal zu wissen scheinst, wie man überhaupt eine Variable innerhalb einer Funktion ändern kann. Call by reference, schon einmal gehört? Vermutlich ja, denn du benutzt es einmal. Aber nicht da, wo es drauf ankommt.

    PS: Ernsthaft: Benutze std::vector.



  • feld ist eine Variable.
    Wenn du den Inhalt dieser Variablen in einer Funktion ändern möchtest, musst du deren Adresse übergeben.
    Das kannst du über Zeiger oder Referenz machen.

    Ja, feld ist ein Zeiger,
    Nein, du übergibst nicht die Adresse von feld sondern den Wert von feld.
    Dieser Wert ist eine Adresse auf den Speicherbereich, den du mit new bekommen hast.

    Benutze std::vector.



  • Vielen Dank für die "persönlich" aufmunternden und motivierenden Antworten.

    Ich wünsche den hier Helfenden weiterhin viel Freude bei ihrem "pädagogischen" Einsatz.



  • Dass das mit Vectoren geht, ist mir schon klar. Ebenso, dass das Ressourcen kostet 😉

    Bei so neunmal klugen Antworten inklusive diesem Smiley reagieren viele einfach tendenziell genervt, besonders wenn es von jemandem kommt, der im Vergleich wirklich absolut keine Ahnung hat.




Log in to reply