Problem mit new[ ], hilfe?!
-
Hi,
folgendes:
*
- ich habe einen Pointer POINT *pt = 0
- in einer Schleife lasse ich den Pointer definieren pt = new POINT[ count ]
- anschliessend möchte ich nun das eben angelegte Array auf das pt zeigt füllen
- zu guter letzt wird der Speicher wieder frei gegeben und das Spiel begint erneut
*Hier mal der code:
void CLineChart::m_DrawAllGraphs( ) { HDC hDC = 0; HPEN hGraphPen = CreatePen( PS_SOLID, 2, RGB( 255, 0, 0 ) ); CGraph cTemp; POINT *ptGraph = 0; long lValue = 0; // ***** Get desc window dc ***** hDC = GetDC( this->m_hDescWindow ); SetViewportOrgEx( hDC, this->m_ChartRect.left, this->m_ChartRect.bottom, 0 ); //SelectObject( hDC, hGraphPen ); for( this->m_GraphIter = this->m_GraphContainer.begin( ); this->m_GraphIter != this->m_GraphContainer.end( ); this->m_GraphIter++ ) { // ***** Current graph object ***** cTemp = *this->m_GraphIter; // ***** Get graph points ***** ptGraph = new POINT[ cTemp.m_GetCounter( ) ]; cTemp.m_ValueIter = cTemp.m_lGraphValues.begin( ); for( int i = 0; i < cTemp.m_GetCounter( ); i++ ) { lValue = *cTemp.m_ValueIter++; ptGraph[ i ].x = ( ( this->m_ChartRect.right / this->m_iXPeak ) * ( i + 1 ) ); if( lValue == 0 ) { ptGraph[ i ].y = this->m_ChartRect.bottom; } else { ptGraph[ i ].y = -( this->m_ChartRect.bottom - ( this->m_ChartRect.bottom / lValue ) ); } } // ***** Draw it ***** ::Polyline( hDC, (const POINT*)&ptGraph, cTemp.m_GetCounter( ) ); // ***** clear ptGraph ***** delete[ ] ptGraph; } // ***** Release dc ***** ReleaseDC( this->m_hDescWindow, hDC ); DeleteObject( hGraphPen ); }Ich habe das Problem, wenn ich das Ding zeichnen lass will sehe ich keine Linie, also muss ich ja hier irgendwo nen Fehler gemacht haben. Die Werte fuer x und y werden berechnet aber ich glaube das es was mit dem Pointer zu tun hat.
Koennt ihr mir evtl. sagen ob ich da irgendwo nen Fehler drin hab?
Gruß Tobi.
-
Hm, wenn ich des***(const POINT*)&*** in Zeile 40 weg nehme, dann gehts, aber wieso?
-
Du nimmst die Adresse eines Zeigers (das ergibt einen Doppelzeiger), und castest ihn dann wieder in einen einfachen Zeiger, damit nimmst Du dem Compiler jegliche Möglichkeit, Dich vor dem Fehler zu warnen (ein Cast sagt aus "ich weiss es besser als Du, lieber Compiler"). Warum castest Du dort überhaupt?
Nunja, wie gesagt ist ptGraph bereits ein Zeiger. Da die Funktion Polyline offenbar einen Zeiger entgegennimmt, darfst Du von dem Zeiger nicht nochmal die Adresse bilden. Und merke: Niemals casten, wenn Du nicht absolut weisst a) warum Du casten musst und b) was Du da castest.

-
Hmm ein paar Sachen verändert:
void CLineChart::DrawAllGraphs() { HDC hDC(GetDC(m_hDescWnd)); SetViewportOrgEx(hDC, m_ChartRect.left, m_ChartRect.bottom, NULL); HPEN hGraphPen(CreatePen(PS_SOLID, 2, RGB( 255, 0, 0 ))); const HGDIOBJ hOldPen(SelectObject(hDC, hGraphPen)); for (m_GraphIter = m_GraphContainer.begin(); m_GraphIter != m_GraphContainer.end( ); ++m_GraphIter) { CGraph& tmp(*m_GraphIter); const std::size_t count(tmp.GetCounter()); POINT* ptGraph(new POINT[count]); tmp.m_ValueIter = tmp.m_lGraphValues.begin(); for (std::size_t i(0); i < count; ++i) { const long value(tmp->m_ValueIter++); ptGraph[i].x = ((m_ChartRect.right / m_iXPeak) * (i + 1)); ptGraph[i].y = (value == 0 ? m_ChartRect.bottom : -m_ChartRect.bottom + (m_ChartRect.bottom / value)); } Polyline(hDC, ptGraph, count); delete[ ] ptGraph; } SelectObject(hDC, hOldPen); DeleteObject(hGraphPen); ReleaseDC(m_hDescWnd, hDC); }1. Warum kopierst du dein CGraph in cTemp?
2. ++x sollte x++ vorgezogen werden, es sei denn, man möchte dessen Effekt nutzen, was in einer for-Schleife allerdings äußerst unwahrscheinlich ist
3. Werte die du öffters brauchst, könntest du sinnvoller weiße in einer Konstanten zwischenspeichern.
4. Wenn du einen Wertebereich von >0 haben willst, dann sag dem Compiler das auch (unsigned)
5. Man hinterlässt einen DC immer im Zustand wie er vorher war(also selben Stifte usw.)
6. Warum legst du Variablen schon im Funktionskopf an? Wenn Sie bsw. durch iwelche Bedingungen NIE gebraucht werden, da die Funktion vorher verlassen wird?
7. Warum sind deine Iteratorn Klassenvariablen?!
8. Ein m_ vor einer Memberfunktion ... Nuja, merkwürdiger Stil