Konstruktor frage c++



  • @zalo3 sagte in Konstruktor frage c++:

    	for(int i = 0; i<(m_arraySize*2);i++) {
    		newRectangle[i] = m_rectangles[i];
    	}
    

    Das kannst Du nicht tunfisch, weil der Speicherbereich auf den m_rectangles zeigt nur m_arraySize Elemente lang ist und Du somit mit m_rectangles[i] mit einem i größer gleich m_arraySize auf Speicher zugreifst, der Dir nicht gehört.

    @zalo3 sagte in Konstruktor frage c++:

    Aber verpeile plötzlich ,da ich merke ,dass ich ja jetzt irgendwie den Scheiss mit den 100 Elementen noch einbauen muss.
    Drehe durch.

    Soll ich dafür jetzt noch ne If Bedingung MACHEN wieder?

    Entweder wie ich oben geschrieben habe

    std::size_t new_size{ m_arraySize < 100 ? m_arraySize * 2 : m_arraySize + 100 };
    

    oder

    std::size_t new_size;
    if( m_arraySize < 100 )
        new_size = m_arraySize * 2;
    else
        new_size = m_arraySize + 100;
    

    @zalo3 sagte in Konstruktor frage c++:

    Was ist das genau mit den kleiner 100 Elementen genau ?
    Speicher voll oder Speicher noch da? Ich denke Speicher da?
    Dann wäre ja mein vergrössern des Arrays falsch?😭

    Sorry, nix verstehen.

    @mechanics sagte in Konstruktor frage c++:

    das ganze ist noch nicht 100% exception safe.

    Aja, std::copy() kann werfen, wenn der copy-ctor wirft. Well ... shit happens.



  • Ich habe gerade ein kleines Problem ,was mir Schwierigkeiten macht die AUfgabe selbst zu lösen

     void CDrawing::add(const CRectangle& rectangle){
    
    
    
    
    if(m_nextFree == m_arraySize ){
    
    
    	CRectangle* newRectangle = new CRectangle [ m_arraySize];
    
    	for(int i = 0; i<(m_arraySize);i++){
    
    		newRectangle[i] = m_rectangles[i];
    
    	}
    	delete[] m_rectangles;
    	m_rectangles = newRectangle;
    
    
    
    }
    m_rectangles[m_nextFree] = rectangle;
    m_nextFree++;
    
    
    }
    

    CRectangle* newRectangle = new CRectangle [ m_arraySize];

    Ich muss ja um ein neues array Speichergrösse festzulegen auch irgendwie so machen:
    CRectangle* newRectangle = new CRectangle [ m_newSize];
    Aber das m_newSize wird dann nicht erkannt ?

    Wie soll ich es vorher definieren ?Das habe ich bei Speicher anlegen noch nie gemacht?
    Da im Header bei unseren AUfgaben immer vorgegeben war ?
    Kann mir das jemand erklären bitte

    Ich will versuchen selbst auf die Lösung zu kommen .Wie swordfish gemacht hast verstehe ich zwar , aber ich will es auch gerne nochmal selber machen



  • @zalo3 sagte in Konstruktor frage c++:

    Ich muss ja um ein neues array Speichergrösse festzulegen auch irgendwie so machen:
    CRectangle* newRectangle = new CRectangle[m_newSize];
    Aber das m_newSize wird dann nicht erkannt?

    Dann wirst Du ein newSize wohl deklarieren und definieren müssen, bevor Du es verwendest.



  • ja habe es gerade gemacht. :smiling_face_with_open_mouth_closed_eyes:

    Ich glaube,dass ich an der Lösung nah dran bin .
    Melde mich in kürze.

    Ich nerve euch bis ich es geschafft habe😇



  •  
    void CDrawing::add(const CRectangle& rectangle){
    
    
    
    
    if(m_nextFree == m_arraySize ){
    
        int m_newSize = m_arraySize*2;
    	CRectangle* newRectangle = new CRectangle [ m_newSize];
    
    	for(int i = 0; i<(m_newSize);i++){
    
    		newRectangle[i] = m_rectangles[i];
    
    	}
    	delete[] m_rectangles;
    	m_rectangles = newRectangle;
    	
    	m_arraySize = m_newSize;
    
    
    
    }
    m_rectangles[m_nextFree] = rectangle;
    m_nextFree++;
    if(m_arraySize < 100){
    	m_newSize = m_arraySize*2;
    }
    else{
    	m_newSize = m_arraySize+100;
    }
    }
    
    
    
    

    Ich verstehe allerdings noch nicht gleich wo das eingebaut werden muss:
    if(m_arraySize < 100){
    m_newSize = m_arraySize*2;
    }
    else{
    m_newSize = m_arraySize+100;
    }

    Da ja der Speicher so nicht erkannt wird ?

    Jetzt langsam habe ich auch keine Idee mehr?



  • Würdest Du bitte deinen Code ordentlich einrücken und überflüssige Leerzeilen entfernen?

    Ach, ich machs selbst:

    @zalo3 sagte in Konstruktor frage c++:

    void CDrawing::add(const CRectangle& rectangle)
     {
     	if (m_nextFree == m_arraySize) {
     		int m_newSize = m_arraySize * 2; // 1)
     		CRectangle* newRectangle = new CRectangle[m_newSize];
    
     		for (int i = 0; i < (m_newSize); i++) {
     			newRectangle[i] = m_rectangles[i]; // 2)
     		}
    
     		delete[] m_rectangles;
     		m_rectangles = newRectangle;
     		m_arraySize = m_newSize;
     	}
     
     	m_rectangles[m_nextFree] = rectangle;
     	m_nextFree++;
     
     	if (m_arraySize < 100) { // 3)
     		m_newSize = m_arraySize * 2; // 4)
     	}
     	else {
     		m_newSize = m_arraySize + 100;
     	}
     }
    
    1. warum stellst Du einer lokalen Variable ein m_ voran ? Den Präfix verwendet man üblicherweise nur für Membervariablen um sie ohne this-> davor von etwaigen gleichnamigen Parametern unterscheiden zu können.

    2. Du greifst mit m_rectangles[i] noch immer (oder schon wieder) auf Speicher zu, der dir nicht gehört wenn i größer gleich m_arraySize wird.

    3. Ist hier fehl am Platz. Erstens soll das nur stattfinden wenn größerer Speicher besorgt werden muss und zweitens ist m_arraySize an dieser Stelle eventuell schon erhöht worden (int m_newSize = m_arraySize * 2; /* ... */ m_arraySize = m_newSize;)

    4. m_newSize existiert hier nicht mehr sondern nur im Scope des if oben, da es darin deklariert wurde.



  •  
    void CDrawing::add(const CRectangle& rectangle){
    
    if(m_nextFree == m_arraySize ){
    
        int m_newSize = m_arraySize*2;
    	CRectangle* newRectangle = new CRectangle [ m_newSize];
    
    	for(int i = 0; i<(m_newSize);i++){
    
    		newRectangle[i] = m_rectangles[i];
    
    	}
    	delete[] m_rectangles;
    	m_rectangles = newRectangle;
    
    	m_arraySize = m_newSize;
    
    }
    
    m_rectangles[m_nextFree] = rectangle;
    m_nextFree++;
    
    if(m_arraySize < 100){
    	m_newSize = m_arraySize*2;
    }
    
    else{
    	m_newSize = m_arraySize+100;
    }
    
    
    }
    
    
    

    Soll ich den Speicher ausserhalb der if Bedingung schon erstellen?



  • So unbeholfen kann man doch nicht sein, oder?
    @Swordfish hat dir doch den Code schon gezeigt...

    @zalo3 sagte in Konstruktor frage c++:

    Wie swordfish gemacht hast verstehe ich zwar

    Das glaube ich dir daher nicht.



  • Keine Fehler

     void CDrawing::add(const CRectangle& rectangle){
    	
    	int m_newSize = m_arraySize*2;
    	CRectangle* newRectangle = new CRectangle [ m_newSize];
    
    if(m_nextFree == m_arraySize ){
    
        for(int i = 0; i<(m_newSize);i++){
    
    		newRectangle[i] = m_rectangles[i];
    
    	}
        
    	delete[] m_rectangles;
    	m_rectangles = newRectangle;
    
    	m_arraySize = m_newSize;
    
    }
    
         m_rectangles[m_nextFree] = rectangle;
         m_nextFree++;
    
    if(m_arraySize < 100){
    	
    	m_newSize = m_arraySize*2;
    }
    
    else{
    	
    	m_newSize = m_arraySize+100;
    }
    
    
    }
    
    

    Bin wie immer offen für Kritik?😄



  • Schön langsam komme ich mir verarscht vor. Du hast meine Anmerkungen zu Deinem Code nicht berücksichtigt sondern nur zwei Zeilen verschoben.

    Was passiert bei Deinem jetzigen Code mit dem mit new[] besorgten Speicher, wenn m_nextFree == m_arraySize nicht wahr ist?



  • Dann wird das hier gemacht:
    m_rectangles[m_nextFree] = rectangle;
    m_nextFree++;

    Aus meiner Sicht richtig ☹



  • Ich hatte vorher dein edit nicht gesehen swordfish.
    Langsam gebe ich auch fast schon auf:
    void CDrawing::add(const CRectangle& rectangle){

    if(m_nextFree == m_arraySize ){
    int newSize = m_arraySize2;
    CRectangle
    newRectangle = new CRectangle [ newSize];
    for(int i = 0; i<(newSize);i++){

    	newRectangle[i] = m_rectangles[i];  ??? Was soll ich hier dann machen?
    }
    

    Wie soll ich sonst die Einträge in das neue Array kopieren ?



  • @swordfish Ich meinte eigentlich, wenn copy wirft, dann wird new_mem nicht freigegeben.



  • Da ist ja wieder viel dazugekommen...
    Zalo3, was ist denn dein Background? Bist du Schüler, Student, studierst was anderes und wirst "gezwungen" in einer Vorlesung zu programmieren? Entweder machst du dich über uns alle lustig, oder du bist ziiiiemlich unbegabt 😉



  • Die scheiss Aufgabe treibt mich in den Wahnsinn.



  • studiere mathe nur ein Fach informatik.
    Und ich hasse es .



  • Du studierst Mathe? Ich bin schockiert 😃
    Nicht nur ein Fach 😉 Als Mathematiker wirst du fast ausschließlich programmieren müssen, oder wie stellst du dir das vor?



  • Ich habe den code noch ein wenig verbessert und es probiert .
    Ich poste es mal rein ,vielleicht hilft das jemand anderen teilweise weiter .

    void CDrawing::add(const CRectangle& rectangle){
    
    
    if(m_nextFree == m_arraySize ){
    	int newSize = m_arraySize*2;
    		CRectangle* newRectangle = new CRectangle [ newSize];
        for(int i = 0; i<(newSize);i++){
    
    		newRectangle[i] = m_rectangles[i];
        }
    
    	delete[] m_rectangles;
    	m_rectangles = newRectangle;
    
    	m_arraySize = newSize;
    
    }
         m_rectangles[m_nextFree] = rectangle;
         m_nextFree++;
    
    if(m_arraySize < 100){
    
    	newSize = m_arraySize*2;
    }
    
    else{
    	    newSize = m_arraySize+100;
         }
    }
    
    
    
    

    Ich verstehe es einfach nicht .
    Ist halt so .



  • Nee, ist immer noch Quatsch.
    Du bist doch Mathematiker. Das ist alles komplett logisch. Die Reihenfolge ist ganz wichtig. Und die ist wohl anders, als das in der Aufgabe angegeben ist. Aber was passieren muss, ist trotzdem straight forward. Du darfst erst das neue Element einfügen, nachdem du sichergestellt hast, dass du genügend Speicher hast. Dafür wurden dir zwei Bedingungen mitgegeben. Das musst du alles vorher auswerten, bevor du neuen Speicher reservierst und rumkopierst. Das für sich stehende if (arraySize < 100) ist daher völlig nutzlos, du reservierst den Speicher danach ja nicht mehr. Wie gesagt, die Reihenfolge ist ganz wichtig, und nicht, einfach nur alles, was in der Aufgabe steht, irgendwie in den Code zu schmeißen.



  • Ehrlich gesagt . Ich verstehe gar nicht warum das rum kopieren gemacht wird ?

    Für was soll ich das rumkopieren ?

    Die Bedingungen weiss ich :
    Einmal : Speicher voll (m_nextFree == m_arraySize) = doppelte Grösse.

    m_nextFree >100 -> arraySize+100

    Die Logik verstehe ich ja


Anmelden zum Antworten