Konstruktor frage c++
-
Fast...
Die letzten beiden Zeilen solltest du aus dem if rausziehen, denn das willst du auf jeden Fall machen, auch wenn der Speicher schon von vornherein gereicht hat.
Und jetzt fehlt noch das mit 100... Das musst du in die Berechnung von newSize einbeziehen.
-
Habe jetzt doch wieder Hoffnung geschöpft.
Ist wie eine Achterbahnfahrt.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<(m_arraySize);i++){ newRectangle[i] = m_rectangles[i]; } delete[] m_rectangles; m_rectangles = newRectangle; m_arraySize = newSize; if(m_arraySize < 100){ newSize = m_arraySize*2; } else{ newSize = m_arraySize+100; } } m_rectangles[m_nextFree] = rectangle; m_nextFree++; }
Das wars?
-
Was machst du beruflich Mechanics?
-
Ich bin Softwareentwickler, wenn man auch die Arbeit als Werkstudent mit dazuzählt, dann schon seit über 10 Jahren.
Das mit dem newSize ist immer noch derselbe Quatsch. Ich weiß nicht, wie ich das sonst erklären soll.... Das if/else ist nicht schlecht. Aber das musst du machen, BEVOR du neuen Speicher anlegst und kopierst.
-
Aber wenn ich jetzt das vor der Speicher Anlegung mache ,dann müsste ich ja den alten Speicher sozusagen anlegen und denn dann vergrössern?
Hatte nicht jemand von euch gesagt ,dass man das nicht machen kann ?
Dann würde ich es so machen:
void CDrawing::add(const CRectangle& rectangle){ if(m_arraySize < 100){ m_rectangles[ m_arraySize*2] = rectangle; } else{ m_rectangles[m_arraySize+100] = rectangle; } if(m_nextFree == m_arraySize ){ int newSize = m_arraySize*2; CRectangle* newRectangle = new CRectangle [ newSize]; for(int i = 0; i<(m_arraySize);i++){ newRectangle[i] = m_rectangles[i]; } delete[] m_rectangles; m_rectangles = newRectangle; m_arraySize = newSize; } m_rectangles[m_nextFree] = rectangle; m_nextFree++; }
-
Rück Deinen Code anständig ein!!
Das
if - else
am Anfang:m_rectangles
zeigt auf Speicher mit den Plätzen von0
bism_arraySize - 1
... Du kannst nicht einfachm_rectangles[m_arraySize * 2]
oderm_rectangles[m_arraySize + 100]
etwas zuweisen! Weg damit!Der rest ist Ok, fehlt nur noch, daß laut Aufgabenstellung
newSize
abhängig von der alten Größem_arraySize
unterschiedlich berechnet wird. Aber das habe ich Dir weiter oben schon vorgepredigt:@swordfish sagte in Konstruktor frage c++:
@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;
-
Gut ich habe es so gemacht wie du gesagt hast .
void CDrawing::add(const CRectangle& rectangle){ std::size_t newSize; if( m_arraySize < 100 ) newSize = m_arraySize * 2; else newSize = m_arraySize + 100; if(m_nextFree == m_arraySize ){ int newSize = m_arraySize*2; CRectangle* newRectangle = new CRectangle [ newSize]; for(int i = 0; i<(m_arraySize);i++){ newRectangle[i] = m_rectangles[i]; } delete[] m_rectangles; m_rectangles = newRectangle; m_arraySize = newSize; } m_rectangles[m_nextFree] = rectangle; m_nextFree++; }
Aber bitte noch um eine kleine Erklärung kann ich sozusagen mit dem size_t auch weiter oben auf den neuen Speicher zugreifen oder wie?
Also sol wie mein code jetzt geht steht würde passen ?
Wir haben size_t nie benutzt
-
Irgendwie ist es zum Heulen
-
Oh nein immer noch falsch oder wie ?
-
Das sind doch nur paar Zeilen Code, siehst du nicht, was du machst?
Die newSize Berechnung ganz oben schaut schon mal richtig aus, aber warum ganz oben? Das brauchst doch erst, wenn du festgestellt hast, dass der Speicher nicht reicht.
Und an der richtigen Stelle fängst du schon wieder an, newSize auszurechnen, und zwar falsch.
-
@zalo3 sagte in Konstruktor frage c++:
Aber bitte noch um eine kleine Erklärung kann ich sozusagen mit dem size_t auch weiter oben auf den neuen Speicher zugreifen oder wie?
Du kannst auf nix zugreifen, daß es an der Stelle noch nicht gibt.
std::size_t
ist bloß ein weiterer Datentyp wie auchchar
,int
,float
,std::string
... für den garantiert ist, daß er groß genug für alle Speichergrößen ist.Zu Deinem Code:
@zalo3 sagte in Konstruktor frage c++:
Gut ich habe es so gemacht wie du gesagt hast .
// ... if(m_nextFree == m_arraySize ){ int newSize = m_arraySize*2; // hier ... CRectangle* newRectangle = new CRectangle [ newSize]; // ...
... berechnest Du bisher die neue Größe. Warum also nicht auch hier die Entscheidung, wie viel mehr Speicher in Abhängigkeit von
m_arraySize
?
-
void CDrawing::add(const CRectangle& rectangle){ if(m_nextFree == m_arraySize ){ std::size_t newSize; if( m_arraySize < 100 ){ newSize = m_arraySize * 2; } else{ newSize = m_arraySize + 100; } CRectangle* newRectangle = new CRectangle [ newSize]; for(int i = 0; i<(m_arraySize);i++){ newRectangle[i] = m_rectangles[i]; } delete[] m_rectangles; m_rectangles = newRectangle; m_arraySize = newSize; } m_rectangles[m_nextFree] = rectangle; m_nextFree++; }
Was ich nicht erstehe warum ich da das size_t bastele ?
Was bewirkt das ?
Damit ich es nächstes mal auch machen kann.
-
Schaut soweit richtig aus.
size_t ist praktisch ein int. Diese Datentypen haben verschiedene Wertebereiche. Der vom int ist z.B. nicht definiert, bei VS ist er auch unter 64Bit 32 Bit groß und geht damit ungefähr -2 Mrd bis +2 Mrd. Damit könntest du keine 3 Mrd Rectangles speichern.
Der size_t ist vorzeichenlos und bei dem ist garantiert, dass du so viele Elemente speichern kannst, wie du Speicher hast.
Für deinen Fall kannst du auch int schreiben, das wär auch egal, aber size_t wär der korrekte Datentyp.
-
@zalo3 sagte in Konstruktor frage c++:
// ...
Na endlich.
@zalo3 sagte in Konstruktor frage c++:
Was ich nicht erstehe warum ich da das size_t bastele ?
Was bewirkt das ?Du kannst auch einen
int
oder sonstwas basteln. Es ist halt nur fürstd::size_t
garantiert, daß der Typ groß genug ist für alles, was im Speicher rumliegt.
-
jaaaaaaaaaaaa endlich geschafft .
JETZT kann ich mich an die Ausgabe der print Methode machen (von Aufgabe)oder es einfach lassen .
Wahrscheinlich würde ich weitere 8h brauchen
-
@zalo3 sagte in Konstruktor frage c++:
JETZT kann ich mich an die Ausgabe der print Methode machen
omg. bitte nicht, wenn Du es vermeiden kannst.
-
Ja ehrlich gesagt . Ich lasse es . Eine 1.0 werde ich sowieso nicht in Klausur schaffen.
Ziel bleibt das bestehen .
Wäre für mich auch mehr als genug.
Wahrscheinlich werde ich mich vielleicht an ner anderen AUfgabe ran wagen.
Aber das problem ist ,dass ich das implementieren mit algorithmen usw einfach nicht selber schaffe.