Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » vector iterator not derefencable

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
15.02.2007, 19:53 Uhr
~Gloem
Gast


Hallo,

ich komm hiermit leider nicht weiter:
Ich versuche ein Polygon per Mausklick zu erstellen indem ich die Punkte in einem Vector speichere.


C++:
((GeoPolygon*)hilfsgeo)->addPoint(point.x, point.y);
                pDoc->thedata.addGeoObject(hilfsgeo);


Der Fehler liegt in diesen beiden Zeilen. Lass ich die erste weg gehts, ansonsten werd ich an der zweiten rausgeworfen mit dem Hinweis das der vector iterator not dereferencable ist.

Erstmal zur Vererbungshierarchie:
GeoShape ist die Basisklasse und GeoPolygon, GeoGroup und GeoPoint ist davon abgeleitet.
hilfsgeo ist ein Zeiger auf ein GeoShape.
addPoint ist eine Methode die nur das GeoPolygon hat(bei einem Punkt macht das keinen Sinn), welche in dem Punktvector des Polygons einen Punkt hinzufügt
thedata ist eine GeoGroup die die Objekte in einem Vector speichert


Ich glaube, zwar, dass das alles so noch nicht klar ist, aber ich hoffe ihr könnt mir trotzdem helfen
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
15.02.2007, 20:01 Uhr
Gloem



Mist, ich war ja noch gar nicht angemeldet.

Vielleicht sind Ausschnitte aus den Headerdateien ganz interessant:

GeoPolygon

C++:
#include "GeoShape.h"        // Bibliothek für Geoshape einbinden
#include "Polygon2D.h"        // Bibliothek für Point2D


// Klassendefinition eines GeoPolygon-Objektes
class GeoPolygon : public GeoShape
{
// Private Bestandteile der Klasse(Datenkapselung)
private:
    Polygon2D itspolygon;

    static const int typ = GEOPOLYGON;

// sämtliche Public-Bestandteile der Klasse
public:
    // Konstruktor mit der übergebenen ID
    GeoPolygon(mstring id)
        :GeoShape(id, GEOPOLYGON){};
...



Polygon2D

C++:
typedef vector<Point2D> Punktvektor;                        // Definieren eines Containertypens für die Punkte
typedef Punktvektor::iterator PunkteIterator;                // Definieren eines Iterator für die Punkte
typedef Punktvektor::const_iterator ConstPunkteIterator;    // Definieren eines Iterators für die const-Funktionen



// Klassendefinition eines Polygon2D-Objektes
class Polygon2D
{
// Private Bestandteile der Klasse(Datenkapselung)
private:
    
    // Die Punkte des Polygons werden in einem Vector gespeichert
    Punktvektor itspunkte;
    
// sämtliche Public-Bestandteile der Klasse
public:
    
    // Konstruktor für ein Polygon2D-Objekt ohne Parameter
    Polygon2D(){}
...



Point2D

C++:
// Klassendefinition eines Point2D-Objektes
class Point2D
{
// Private Bestandteile der Klasse(Datenkapselung)
private:

    // die beiden Attribute eines Punktes
    double itsX;
    double itsY;
...



GeoGroup

C++:
#include "GeoShape.h"        // Bibliothek für Geoshape einbinden
#include "GeoPoint.h"        // Bibliothek für GeoPoint
#include "GeoPolygon.h"        // Bibliothek für GeoPolygon
#include <fstream>            // Bibliothek für Dateistream
#include <sstream>            // Bibliothek für Streamstream

typedef vector<GeoShape*> Geovektor;                        // Definieren eines Containertypens für die GeoObjekte
typedef Geovektor::iterator GeoIterator;                    // Definieren eines Iterator für die GeoObjekte
typedef Geovektor::const_iterator ConstGeoIterator;            // Definieren eines Iterators für die const-Funktionen


// Klassendefinition eines GeoGroup-Objektes
class GeoGroup : public GeoShape
{
// Private Bestandteile der Klasse(Datenkapselung)
private:
    // Die Objekte der GeoGroup werden in einem Vector gespeichert
    Geovektor itsgeos;

    static const int typ = GEOGROUP;
...

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
15.02.2007, 22:23 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Hi Zeig mal die Implementierung von GeoGroup,
u.A. das addGeoObject

Wenn ich richtig verstehe erzeugt diese Zeile den Fehler?

Würde tippen du vergleichst Pointer mit Objekt, oder Iterator mit Pointer, oder oder oder
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
15.02.2007, 23:02 Uhr
Gloem



Eigentlich sollte es daran nicht liegen da es in einem Programm funktioniert hat.

GeoGroup

C++:
// Methode um GeoObjekte zur GeoGroup hinzuzufügen
void GeoGroup::addGeoObject(GeoShape* geo)
{
        itsgeos.push_back(geo);
}



Polygon2D

C++:
// Methode zum Hinzufügen eines Point2D-Objektes zum Polygon
void Polygon2D::addPoint(const Point2D punkt)
{
    // Wenn das Polygon noch keine Punkte hat
    if(itspunkte.empty())
    {
        // Anlegen des einzigen Punktes an erster und letzter Position
        itspunkte.push_back(punkt);
        itspunkte.push_back(punkt);
    }
    // Im Polygon ist mindestens ein Punkt
    else
    {
        // Iteratoren für das Ende des Vectors
        PunkteIterator last(itspunkte.end());
        // Einfügen an der vorletzten Position
        itspunkte.insert(--last, punkt);
    }
}



Was bedeutet der Fehler "vector iterator not dereferencable" eigentlich?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
15.02.2007, 23:05 Uhr
Gloem



Nochmal die ganze Methode die den Fehler erzeugt

C++:
void CstudienleistungView::OnLButtonDown(UINT nFlags, CPoint point)
{
    CstudienleistungDoc* pDoc = GetDocument();
    GeoShape* hilfsgeo;
    
    switch(m_nOperation)
    {
        case INPUT_POINT:
            char id[10];
            sprintf_s(id,"%d",zaehler++);
            hilfsgeo = new GeoPoint(id, point.x, point.y);
            pDoc->thedata.addGeoObject(hilfsgeo);
            Invalidate();
            break;
        case INPUT_POLYGON:
            if(neues_polygon)
            {    
                neues_polygon = false;
                char id[10];
                sprintf_s(id,"%d",zaehler++);
                hilfsgeo = new GeoPolygon(id);
                ((GeoPolygon*)hilfsgeo)->addPoint(point.x, point.y);
                pDoc->thedata.addGeoObject(hilfsgeo);
            }
            else
            {
                Geovektor geo_vektor = pDoc->thedata.getGeos();
                GeoIterator geo_last(geo_vektor.end());
                geo_last--;
                ((GeoPolygon*)*geo_last)->addPoint(point.x, point.y);
            }
            Invalidate();
            break;
    }

    CView::OnLButtonDown(nFlags, point);
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
16.02.2007, 09:30 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


wo tritt der Fehler denn genau auf?

ich würde eher tippen das passiert hier irgendwo:


C++:
                Geovektor geo_vektor = pDoc->thedata.getGeos();
                GeoIterator geo_last(geo_vektor.end());
                geo_last--;
                ((GeoPolygon*)*geo_last)->addPoint(point.x, point.y);



Ansonsten ist hier ein fehler - du kopierst den geo_vektor und veränderst nur die kopie, nicht den aus thedata.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
16.02.2007, 11:23 Uhr
Gloem



Im ersten Durchlauf quasi beim Anlegen des Polygons kommt der Fehler in diesen beiden Zeilen:


C++:
((GeoPolygon*)hilfsgeo)->addPoint(point.x, point.y);
pDoc->thedata.addGeoObject(hilfsgeo);



Da kommt ein PopUp mit der Fehlermeldung. Mit dem Debugger läuft es aber durch beide Zeilen durch. Kommentiere ich hiervon die erste Zeile aus, kommt dasselbe PopUp, jedoch erst, wenn sich das Programm im Else-Zweig befindet
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
16.02.2007, 12:01 Uhr
Gloem



Sorry,

Fehler gefunden, lag doch an einer anderen Stelle. Hab bei der Ausgabe einen kleineren Fehler gemacht und deshalb konnte der iteraror nicht derefernciert werden.

Wurde die eine Zeile auskommentiert, wurde das Polygon nicht angelegt und musste daher nicht gezeichnet werden -> kein Fehler.

Aber trotzdem danke für deine Hilfe. Tut mir leid euch hiermit belästigt zu haben.


Zitat:

Ansonsten ist hier ein fehler - du kopierst den geo_vektor und veränderst nur die kopie, nicht den aus thedata.



Das funktioniert aber komischerweise, da getGeos() nicht eine Kopie sondern das aktuelle Objekt zurückgibt.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
16.02.2007, 17:33 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


aso du gibts eine referenz zurück? dann passt das zweite.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ VC++ / MFC ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: