Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Raetselhafter Fehler

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
05.12.2004, 17:14 Uhr
derphilipder



Ich habe eine Klasse Graph

C++:
#ifndef _MYGRAPH_
#define _MYGRAPH_

#include <vector>
#include <qcolor.h>
#include <qstring.h>
using namespace std;

enum graphtype{standard, spektral};

class Graph
{
protected:
    string name;             //Name/Titel des Graphen
    string unit;             //Einheit der Werte
    graphtype type;             //Art des Graphen(z.B. Spektralgraph)
    std::vector<double> *f_values;//Funktionswerte
    QColor color;             //Farbe des Graphen
    Qt::PenStyle style;         //Linientyp des Graphen
    int x_number;             //Anzahl der Wertepaare
    double x_min, x_max;     //Wert des kleinsten und groessten X-Wertes
    double y_min, y_max;     //Wert des kleinsten und groessten Y-Wertes

public:
    Graph(string nam) : type(standard), name(nam), color(Qt::red), style(Qt::SolidLine), x_number(0), y_min(0.0), y_max(0.0), x_min(0.0), x_max(0,0){}
    Graph(std::vector<double> *val, string nam);
    Graph(string nam, std::vector<double> *val, QColor col, Qt::PenStyle st, double min, double max);
    virtual ~Graph(){if(f_values != NULL) delete f_values;}

    //Zugriffsmethoden------------------
    string GetName()const {return name;}
    string GetUnit()const {return unit;}
    graphtype GetType()const {return type;}
    std::vector<double>* GetValues()const {return f_values;}
    QColor GetColor()const {return color;}
    Qt::PenStyle GetStyle()const {return style;}
    int GetNumber()const {return x_number;}
    double GetxMin()const {return x_min;}
    double GetxMax()const {return x_max;}
    double GetyMin()const {return y_min;}
    double GetyMax()const {return y_max;}
    double GetValue(int index)const;

    void SetName(string nam){name=nam;}
    void SetUnit(string un){unit=un;}
    void SetValues(std::vector<double>* val);
    void SetColor(QColor col){color=col;}
    void SetStyle(Qt::PenStyle st){style=st;}
    void SetMinX(double min){if(min<=x_max)x_min=min;}
    void SetMaxX(double max){if(max>=x_min)x_max=max;}
    void SetValue(double val, int index) {if(index<=x_number&&index>=0)(*f_values)[index]=val;}
    //------------------------------------

    void CalcYMaxMin();//Errechnet y_min und y_max
    void NormValues();//Normiert alle Werte

    friend class Diagram;
};

#endif



Und eine Klasse Diagram

C++:
#ifndef _DIAGRAM_
#define _DIAGRAM_

#include <vector>
#include <qpoint.h>
#include <qpen.h>
#include "graph.h"

using namespace std;

//Fuer Zeichenpunkte
struct Drawpoints
{
    vector<QPoint> points;
    QColor color;
    Qt::PenStyle style;
};

class Diagram
{
protected:
    //Diagrameigenschaften-----------------
    string title,    //Diagram-Titel
        y_name,        //Name/Einheit der y-Achse
        x_name,        //Name/Einheit der x-Achse
        stat_string;//Fuer diverse Ausgaben, wie die Namen der angezeigten Graphen etc.
    graphtype type; //Diagrammtyp
    QPoint abs_pos, //Position (links, oben) des gesamten Diagrams im uebergeordneten Zeichenbereich
        draw_pos;    //Position des Zeichenbereichs
    int x_size,        //Absolute X-Abmessung
        y_size,        //Absolute Y-Abmessung
        x_res,        //X-Abmessung des Zeichenbereichs
        y_res,        //Y-Abmessung des Zeichenbereichs
        left_margin,//Breite des linken Randes
        right_margin,//Breite des rechten Randes
        top_margin, //Breite des oberen Randes
        bottom_margin,//Breite des unteren Randes
        y_num,        //Anzahl der Y-Achsen
        graph_num;    //Anzahl der vorhandenen Graphen
    double maxx, minx, //Groesster und kleinster X-Wert
        *maxy, *miny;    //Groesster und kleinster Y-Wert
    QColor axis_color,        //Farbe der Achsen und Skalierung
            maingrid_color, //Farbe der Hauptgitternetzlinie
            helpgrid_color;    //Farbe der Hilfsitternetzlinien
    Qt::PenStyle axis_style,    //Linienstil der Achsen und Skalierung
            maingrid_style,        //Haupgitternetzlinien
            helpgrid_style;        //Farbe der Hilfsgitternetzlinien
    //Flags--------------------------------
    bool maingrid_flag,      //Soll Hauptgitternetz dargestellt werden
        helpgrid_flag,      //Soll Hilfsgitternetz dargestellt werden
        ylog_flag,          //Logarithmische Skalierung der Y-Achse
        xlog_flag,          //Logarithmische Skalierung der X-Achse
        auto_x_flag,      //Sollen minx und maxx anhand der aktiven Graphen ermittelt werden
        auto_y_flag;      //Sollen miny und maxy anhand der aktiven Graphen ermittelt werden
    //-------------------------------------
    std::vector<Graph> *graphptr;            //Vector mit beliebig vielen Graphen
    std::vector<bool>* graph_active;        //jedem Graphen ist ein bool zugeordnet / true=>Graph ist aktiviert/wird dargestellt
    std::vector<int>* graph_axis;            //ordnet Graphen unterschiedlichen Y-Achsen zu
    //Graphikpunkte und Texte------------------------
    std::vector<Drawpoints>* graphpoints;    //Koordinaten der darzustellenden Graphen
    std::vector<Drawpoints>* axpoints;        //Eckpunkte des Zeichenbereichs
    std::vector<Drawpoints>* y_axpoints;        //Fuer zusaetzliche Y-Achsen
    std::vector<Drawpoints>* skalpoints;        //Punke der Skalierung(X und Y)
    std::vector<Drawpoints>* maingridpoints;    //Punkte des Hauptgitters
    std::vector<Drawpoints>* helpgridpoints;    //Punkte des Hilfsgitters
    std::vector<Drawpoints>* paintpointer[6];    //Enthaelt obige pointer

    std::vector<string>* y_units;                //Einheiten der zusaetzlichen Achsen
    std::vector<double>** ax_values;            //Die zur Skalierung gehoerenden Werte
    //----------------------------------------------
public:
    Diagram(string tit, int x_s, int y_s, QPoint abs);
    virtual ~Diagram();
...


mit der Methode

C++:
bool Diagram::AddGraph(Graph* gr)//Fuegt einen neuen Graphen zum Diagramm hinzu
{
    if(graphptr!=NULL)
    {
        int size=graphptr->size();
        for(int i=0; i<size; i++)
        {
            if(((*graphptr)[i]).name==gr->name)//Existiert ein Graph mit selbem Namen
                return false;
        }
    }
    graphptr->push_back(*gr);
    graph_active->push_back(true);
    graph_axis->push_back(0);
    graph_num++;
    return true;
}


Damit mache ich folgenden Beispielaufruf

C++:
    Graph g("graph1"), g2("graph2");
    g2.SetColor(green);
//...
                dateiname = "Daten500.txt";//menu.StringDialog("   Bitte Dateinamen eingeben: ");
                        ifstream file(dateiname.c_str());
                        if(file)//Datei konnte geoeffnet werden
                        {
                            int lines, index, prev_index;
                            double step = 0.0, stepsum = 0.0;
                            vector<double> *filevalues=new vector<double>;
                            
                            for(lines=0; !file.eof(); lines++)//Anzahl der Werte in Datei ermitteln
                            {
                                getline(file, value);
                                filevalues->push_back((double) atof(value.c_str()));                                
                            }
                            //-------------------------------------------------
                            filevalues->pop_back();
                            g.SetValues(filevalues);
                            d.AddGraph(&g);
                            d.CalcGraphPoints();
        
                            //------------------------------------------------
                    
                            file.close();file.clear();
                        }
                        else
                        {
                            menu.ShowMsg("Fehler beim Oeffnen der Datei");
                        }
                        dateiname = "Daten70.txt";//menu.StringDialog("   Bitte Dateinamen eingeben: ");
                
                        file.open(dateiname.c_str());

                        if(file)//Datei konnte geoeffnet werden
                        {
                            int lines, index, prev_index;
                            double step = 0.0, stepsum = 0.0;
                            vector<double> *filevalues=new vector<double>;
                            
                            for(lines=0; !file.eof(); lines++)//Anzahl der Werte in Datei ermitteln
                            {
                                getline(file, value);
                                filevalues->push_back((double) atof(value.c_str()));                                
                            }
                            //-------------------------------------------------
                            filevalues->pop_back();
                            g2.SetValues(filevalues);
                            d.AddGraph(&g2);//<== Problem!
                            d.CalcGraphPoints();
                            //------------------------------------------------
                            menu.ShowMsg("Daten erfolgreich eingelesen");
                            file.close();



Und nun zum Problem - sobald ich den zweiten Graphen hinzufüge, ist der Erste zwar immer noch da, aber der vector mit den Funktionswerten wird geleert...
Ich kann mir das nicht erklären.
--
Konfuzius says: "A man who goes to bed with an itchy asshole is a man who wakes up with stinky finger!"
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
05.12.2004, 17:39 Uhr
derphilipder



Genaugenommen passiert das genau hier:

C++:
bool Diagram::AddGraph(Graph* gr)//Fuegt einen neuen Graphen zum Diagramm hinzu
{
    if(graphptr!=NULL)
    {
        int size=graphptr->size();
        for(int i=0; i<size; i++)
        {
            if(((*graphptr)[i]).name==gr->name)//Existiert ein Graph mit selbem Namen
                return false;
        }
    }
    graphptr->push_back(*gr);//<=Hier!
    graph_active->push_back(true);
    graph_axis->push_back(0);
    graph_num++;
    return true;
}


--
Konfuzius says: "A man who goes to bed with an itchy asshole is a man who wakes up with stinky finger!"
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
05.12.2004, 20:10 Uhr
dascandy




C++:
bool Diagram::AddGraph(Graph* gr)//Fuegt einen neuen Graphen zum Diagramm hinzu
...
    graphptr->push_back(*gr);//<=Hier!


Sie kopieren ein Graph ohne die einhalt auch zu kopieren. Warum gebrauchen Sie ein vector mit Graph objekten und keine vector mit pointers nach objekten?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
05.12.2004, 20:21 Uhr
derphilipder



Ok, ich werds mal mit pointern probieren.

Aber warum sollte bei einer Kopie der Inhalt nicht mitkopiert werden?
--
Konfuzius says: "A man who goes to bed with an itchy asshole is a man who wakes up with stinky finger!"
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
05.12.2004, 20:27 Uhr
dascandy




Zitat:
Ok, ich werds mal mit pointern probieren.

Aber warum sollte bei einer Kopie der Inhalt nicht mitkopiert werden?

Der Inhalt sollte mitkopiert werden, aber dieser Teil des Inhalts ist nur ein Pointer. Er wird als als Pointer mitkopiert und nicht dupliziert (den Einhalt bleibt den gleichen Objekt), deswegen glaubte ich dat es etwas ausmachen konnte. Jedenfalls, wenn Sie diese Klassen brauchen wollten werden Sie sehr fremde Problemen treffen.

Mein Idee war das sie den Einhalt der Vector änderte bevor Sie sie sahen von diesen Objekt aus.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
05.12.2004, 20:32 Uhr
derphilipder



Ich kann das nicht ganz nachvollziehen, aber es funktioniert tatsächlich mit Pointern!

Vielen Dank!
--
Konfuzius says: "A man who goes to bed with an itchy asshole is a man who wakes up with stinky finger!"
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


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: