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!" |