Resize() Funktion



  • Hallo ich habe gerade Schwierigkeiten eine Aufgabe zu lösen beziehungsweise weiß nicht ob ich Sie richtig gelöst habe.
    Frage: Implementieren Funktion resize(unsigned l) die den Vektor in eine andere Dimension projiziert. Falls die neue Länge kleiner als die aktuelle ist, sollen die Werte abgeschnitten werden. Ist neue größer, dann soll der Vektor verlängert und neue Werte geeignet initialisiert.

    Der vorgegebene Quellcode:

    class vektor {
    private:
    	int _len;
    	int *_vek;
    public:
    	vektor(unsigned len);
    	virtual ~vektor();
    	void resize(unsigned l);
    };
    #endif /* VEKTOR_H_ */
    

    Meine Lösung

    #include "vektor.h"
    void vektor::resize(unsigned l) {
    	if(l<_len){
    	_vek=new int[l];	
    	}
    	if(l>_len){
    		_vek=new int[l];	
    		}
    	
    	
    }	
    }
    

    Habe ich die Aufgabe richtig gelöst oder ist diese falsch. Ich bedanke mich im Voraus



  • Hallo,

    dass dein l < len genauso aussieht wie dein l > len sollte dir schonmal zu denken geben...
    Die bisherigen Werte des Vektors sollen erhalten bleiben; das passiert bei dir überhaupt nicht.


  • Mod

    Falsch. Hast du nicht wenigstens einmal den Code ausprobiert, bevor du hier gefragt hast? Es sollte bei egal welchem Aufruf der Funktion unmittelbar offensichtlich sein, dass die Funktion nicht die Anforderungen erfüllt.

    Oder hast du darüber nachgedacht, ob die Funktion richtig sein kann, bevor du hier gefragt hast? Wie soll eine Fallunterscheidung korrekt sein, die in beiden Fällen das gleiche tut?

    Unabhängig von der konkreten Funktion, ist deine Speicherverwaltung grundlegend falsch gemacht. Da ich vermute, dass es bei der Aufgabenstellung darum geht, korrekte Speicherverwaltung zu erlernen, hoffe ich mal, dass das in späteren Aufgabenteilen noch korrigiert wird. Aber es kann auch gut sein, dass du die vorherigen Aufgabenteile bereits falsch gelöst hast.



  • @Jockelx stimmt ich hätte auch komplett die If-Abfragen sein lassen und stattdessen nur

    _vek=new int[l];
    

    machen sollen. Aber das ist falsch. Wie könnte ich es stattdessen machen sollen



  • @tariker
    Die einfache, naive Lösung ist, dass du immer ein neues Array anlegst und dann die passende Anzahl von Elementen kopierst. Natürlich musst du das alte Array löschen, sonst hast du ein Speicherleck (du forderst Speicher mit new[] an, gibst ihn aber nie wieder frei).
    Außerdem solltest du dir angewöhnen, Variablen zu initialisieren. In deinem Fall kannst du beim ersten Resize Aufruf nicht sagen, ob sich bereits Daten im Vektor befinden oder _len und _vek zufällige Werte haben.
    Das könnte in etwa so aussehen:

    class vektor
    {
        std::size_t length_ = 0;
        int* data_          = nullptr;
    
    public:
       vektor() = default();
       vektor( std::size_t size )
       {
          Resize( size );
       }
    
       ~vektor()
       {
          release();
       }
        
       void Resize( std::size_t new_size )
       {
          // neuen Speicher anfordern
          int* new_data = ...
    
          // Elemente kopieren
          ...
    
         // alten Speicher freigeben
         release();
    
         // neuen Zustand merken
         ...
       }
    private:
       void release()
       {
          delete[] data;
          data_ = nullptr;
          length_ = 0;
       }
    };
    

    Wenn du den fehlenden Code ergänzt hast und die Resize() Methode funktioniert können wir uns über die Designprobleme unterhalten (Rule of 3/5). Und über mögliche Optimierungen, um die Anzahl der Speicherallokationen zu verringern.


  • Mod

    Ich würde zuerst die Grundsatzprobleme lösen, dann das resize implementieren. Schließlich kann und sollte man resize implementieren, indem man die grundlegenden Funktionen benutzt.



  • @DocShoe İch bedanke mich 🙂



  • @SeppJ Ich fürchte Du bist nicht wirklich verstanden worden 😞



  • @tariker sagte in Resize() Funktion:

    Implementieren Funktion resize(unsigned l) die den Vektor in eine andere Dimension projiziert

    Hui, jetzt wirds aber interessant! Pass aber auf, dass dabei nicht Skynet entsteht.


  • Mod

    @Swordfish sagte in Resize() Funktion:

    @SeppJ Ich fürchte Du bist nicht wirklich verstanden worden 😞

    Ich auch. Nun, die nötigen Stichworte sind allesamt genannt worden, und es wurde auch der richtige Kurs beschrieben. Wenn @tariker lieber eine mittelschlechte Lösung abschreibt, anstatt sich fortzubilden, dann ist das sein Problem, nicht meines.


Log in to reply