Gleiche Funktion mit verschiedenem Interface liefert unterschiedliche Ergebnisse
-
foobar schrieb:
Mir scheint, dass dieser Aufruf nicht das liefert, was du haben möchtest.
Doch genau das tut er. Wenn ich mir die Daten im vector anschaue finde ich exakt die ich eingeben habe. Das ist es ja was mich so verrückt macht.
-
Was passiert denn, wenn du aus Variante 2, Variante 1 aufrufst? Also sowas:
std::shared_ptr<QwtPlotCurve> Plotter::create_spline(funktion &q, ploting_range &range, bool show, QPen pen) { std::shared_ptr<QwtPlotCurve>myLine(new QwtPlotCurve(QString(""))); std::vector<punkt<double>>points = q.werte(range.von, range.bis, range.schrittweite); return create_spline(points, show, pen); }
Dann würdest du in Variante 1 garantiert den selben Vector benutzen, den du sonst in Variante 2 verwendet hast.
Edit: Gibt es einen Grund, dass du in create_spline keine Referenz auf den Vektor übergibst?
-
Schlangenmensch schrieb:
Was passiert denn, wenn du aus Variante 2, Variante 1 aufrufst?
Dann tritt ebenfalls der Fehler auf.
Dennoch weiß ich jetzt noch nicht woran es liegt.
Demnach muss es irgendwo in der Funktionstd::shared_ptr<QwtPlotCurve> Plotter::create_spline(std::vector<punkt<double>>& points, bool show, QPen pen) { std::shared_ptr<QwtPlotCurve>myLine(new QwtPlotCurve(QString(""))); plot_line(myLine, points, show, pen); return myLine; }
ein Problem geben, aber welches?
Schlangenmensch schrieb:
Edit: Gibt es einen Grund, dass du in create_spline keine Referenz auf den Vektor
übergibst?Keinen expliziten...
-
Wie sieht denn
QwtPlotCurve::setSamples
aus?
-
http://qwt.sourceforge.net/class_qwt_plot_curve.html#aa51cd3fa00f2a046ca5a9889c5db2413
Gibt es drei überladene Funktionen, in meinem Fall wird die zweite Verwendet.
-
hustbaer schrieb:
Wie sieht denn QwtPlotCurve::setSamples aus?
Ich bin der Meinung, es spielt überhaupt keine Rolle, was in
plotLine
oder noch tiefer insetSamples
passiert.axels. schrieb:
Variante 1
std::shared_ptr<QwtPlotCurve> Plotter::create_spline(std::vector<punkt<double>> points, bool show, QPen pen) { std::shared_ptr<QwtPlotCurve>myLine(new QwtPlotCurve(QString(""))); plot_line(myLine, points, show, pen); return myLine; }
Variante 2
std::shared_ptr<QwtPlotCurve> Plotter::create_spline(funktion &q, ploting_range &range, bool show, QPen pen) { std::shared_ptr<QwtPlotCurve>myLine(new QwtPlotCurve(QString(""))); std::vector<punkt<double>>points = q.werte(range.von, range.bis, range.schrittweite); plot_line(myLine, points,show, pen); return myLine; }
plot_line
bekommt 4 parameter. Aus deinem Post geht hervor, dass der erste (myLine
) bei beiden identisch ist, weil innerhalb voncreate_spline
identisch erzeugt. Wenn die beiden Varianten mit demselbenshow
und demselbenpen
aufgerufen werden, kann der Fehler doch nur beim Parameterpoints
liegen.Ich bleibe dabei: stelle sicher, dass die 4 Parameter, die plot_line nimmt bei beiden Aufrufen identisch sind, dann muss auch dasselbe rauskommen. (Ist vielleicht beim einen Aufruf, bei dem kein Plot angezeigt wird,
show == false
...?)
-
axels. schrieb:
Keinen expliziten...
Hast du es denn mal mit der Referenz versucht? (Ich wollte nur ausschließen, dass mit dem Copy ctor von "punkt" etwas nicht stimmt.)
Ansonsten wäre evt. dann tatächlich die Implementation von punkt Interessant und wie die übergebene Funktion q, bzw. q.werte(....) aussieht.
-
foobar schrieb:
hustbaer schrieb:
Wie sieht denn QwtPlotCurve::setSamples aus?
Ich bin der Meinung, es spielt überhaupt keine Rolle, was in
plotLine
oder noch tiefer insetSamples
passiert.Na, schön für dich.
Ich wollte einfach wissen ob setSamples ne "deep copy" macht. Tut es. Damit ist es OK. Täte es das nicht, hätte es der Grund für den Fehler sein können.
-
foobar schrieb:
plot_line
bekommt 4 parameter. Aus deinem Post geht hervor, dass der erste (myLine
) bei beiden identisch ist, weil innerhalb voncreate_spline
identisch erzeugt. Wenn die beiden Varianten mit demselbenshow
und demselbenpen
aufgerufen werden, kann der Fehler doch nur beim Parameterpoints
liegen.Ich bleibe dabei: stelle sicher, dass die 4 Parameter, die plot_line nimmt bei beiden Aufrufen identisch sind, dann muss auch dasselbe rauskommen. (Ist vielleicht beim einen Aufruf, bei dem kein Plot angezeigt wird,
show == false
...?)Selbst wenn ich beide Funktionen direkt hintereinander aufrufe, mit den selben Parmetern tritt der Fehler auf.
Schlangenmensch schrieb:
Hast du es denn mal mit der Referenz versucht? (Ich wollte nur ausschließen, dass mit dem Copy ctor von "punkt" etwas nicht stimmt.)
Ja habe ich versucht. Hat nichts gebracht.
Schlangenmensch schrieb:
Ansonsten wäre evt. dann tatächlich die Implementation von punkt Interessant und wie die übergebene Funktion q, bzw. q.werte(....) aussieht.
punkt ist wie folgt implementiert:
template<typename T> class punkt { public: punkt() :m_x(0), m_y(0) {}; punkt(T x,T y){ m_x = x; m_y = y; } punkt(std::string &v) { int o_brack = v.find("("); int mid = v.find("|"); int c_brack = v.find(")"); try { m_x = T(std::stod(v.substr(o_brack + 1, (o_brack + 1 - mid)))); m_y = T(std::stod(v.substr(mid + 1, (mid + 1 - c_brack)))); } catch (const std::invalid_argument&) { throw std::exception("Error! Invalid Expression"); } catch (const std::out_of_range &) { throw std::exception("Error! Invalid Expression"); } } T& get_x() { return m_x; } T& get_y() { return m_y; } T get_x() const { return m_x; } T get_y() const { return m_y; } T Round(T Zahl, int Stellen); static bool compare_x(const punkt& first, const punkt& second) { return first.get_x() < second.get_x(); } bool operator!=(const punkt &rhs); bool operator==(const punkt& rhs); std::string to_string(); template<typename T> friend std::ostream &operator<<(std::ostream &ostr, const punkt<T> &a); template<typename T> friend std::istream &operator>>(std::istream &istr, punkt<T> &a); virtual ~punkt() {} protected: T m_x, m_y; void set_x(T t) { m_x = t; } void set_y(T t) { m_y = t; } }; template<typename T> inline T punkt<T>::Round(T Zahl, int Stellen) { double v[] = { 1, 10, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, 1e10, 1e11,1e12,1e13,1e14,1e15,1e16,1e17 }; // mgl. verlängern return floor(Zahl * v[Stellen] + 0.5) / v[Stellen]; } template<typename T> inline bool punkt<T>::operator!=(const punkt &rhs) { if (rhs.get_x() == get_x()) if (rhs.get_y() == get_y()) return false; else return true; else return true; } template<typename T> inline bool punkt<T>::operator==(const punkt &rhs) { if (rhs.get_x() == get_x()) if (rhs.get_y() == get_y()) return true; else return false; else return false; } template<typename T> inline std::ostream &operator<<(std::ostream &ostr, const punkt<T> &a) { ostr << "(" << a.get_x() << "|" << a.get_y() << ")\n"; return ostr; } template<typename T> inline std::istream &operator >> (std::istream &istr, punkt<T> &a) { std::string tmp; std::getline(istr, tmp, '\n'); a = punkt<T>(tmp); return istr; } template<typename T> inline std::string punkt<T>::to_string() { return std::string("(" + boost::lexical_cast<std::string>(get_x()) + "|" + boost::lexical_cast<std::string>(get_y()) + ")\n"); }
-
Ich habe jetzt noch versucht einem temporären "funktion"-Objekt die Punkte zuzuweißen um die Variante mit dem "funktion"-Objekt als Parameter zu verwenden.
Ergebniss: Der selbe Fehler tritt immernoch auf.Langsam wird's echt seltsam.
Hat noch jemand eine Idee?
Evtl. die Gegebenheiten des Aufrufers?
-
Prinzipiell ein minimales aber kompilierbares Beispiel bei dem der Fehler auftritt. Damit man alles zusammen hat, wo der Fehler liegen kann und sich das mal selbst im Compiler / Debugger anschauen kann.
-
Schlangenmensch schrieb:
Prinzipiell ein minimales aber kompilierbares Beispiel bei dem der Fehler auftritt. Damit man alles zusammen hat, wo der Fehler liegen kann und sich das mal selbst im Compiler / Debugger anschauen kann.
Ich weiß schon, nur um ein kompilierbares Beispiel wird hier sehr schnell sehr groß, weil einfach ein rießen Ratenschwanz hinten dran hängt.
-
Wenn du den Fehler finden willst, und sonst keine Ideen mehr hast, dann wird das aber vermutlich der beste Weg sein.
-
Hallo Axel,
vllt. wäre dies mal ein Grund, um mit Unit-Tests anzufangen: Liste von Modultest-Software/C++?
Für Qt: QTestLib
Oder den Code so abstrahieren, daß die Unit-Tests nur auf Nicht-QT-Code angewendet werden (falls du ein anderes Test-Framework bevorzugst).
-
Th69 schrieb:
vllt. wäre dies mal ein Grund, um mit Unit-Tests anzufangen
Mach ich schon seit geraumer Zeit für alles was nicht Qt ist, da ich noch keine Möglichkeit gefunden habe QTest in Visual Studio zu nutzen.
-
Ok, Lösung gefunden:
Ich lass jetzt einfach aus der Klasse die für die Oberfläche der Wertetabelle zuständig ist ein Signal an die Klasse für das Mainwindow senden um von dort aus alles zu starten.
Danke an alle die geholfen haben.
-
Kurze Frage: Läuft das in verschiedenen Threads?
-
Schlangenmensch schrieb:
Kurze Frage: Läuft das in verschiedenen Threads?
Aktuell, nein.