unerklärlich...
-
Aaalso ... das Problem ist in meiner GUI. Diese GUI benutzt Allegro. Die "Problem-Dateien" lade ich gleich mal hoch.
Und: Im Konstruktor eines jeden Elementes werden benutzte Elemente auch erzeugt. Im Beispiel würde
elemalso auf ein ElementB-Objekt zeigen.
Dasselemauf nichts zeigt ist sowieso ausgeschlossen, dathis->elem->setSize( 6, 7 );ja prima funktioniert.
Benutzt ein Element ein anderes ist der Konstrukor in etwa so:
Element::Element( ) : elem( NULL ) { this->elem = new ElementB( ... ); }Ich such mal was raus und lad's hoch...
-
ChristophLu schrieb:
Die "Problem-Dateien" lade ich gleich mal hoch.
Hochladen?

Was verstehst du nicht an MINIMAL? Mach ein kurzes einfaches Beispielprogramm, welches dein Problem repräsentiert und den Fehler reproduziert. Es wird hier niemand deine Quellcodedateien durchschauen und sich dann noch selber ein Beispielprogramm schreiben.ChristophLu schrieb:
Dass
elemauf nichts zeigt ist sowieso ausgeschlossen, dathis->elem->setSize( 6, 7 );ja prima funktioniert.
Nein, es ist nicht ausgeschlossen. Es wäre undefined behavior, da ist alles möglich. Es darf funktionieren, es darf nicht funktionieren, es darf die Welt untergehen, es kann dein Computer explodieren, es ist halt einfach nicht definiert, was passieren wird.
Grüssli
-
So ...
Die betreffenden Zeilen sind: Counter.cpp.txt-> Zeile 107 und 111
http://home.arcor.de/minicrispie/Problem/
Ich hoffe, das hilft weiter oO
-
ChristophLu schrieb:
So ...
Die betreffenden Zeilen sind: Counter.cpp.txt-> Zeile 107 und 111
http://home.arcor.de/minicrispie/Problem/
Ich hoffe, das hilft weiter oO
MINIMAL-Beispiel!!!!111einself
glaub nicht, dass sich hier wer den gesamten code angucken möchte (btw finde ich kommentare wie END OF FILE nicht gerade zweckmäßig)
außerdem hat man dort auch kein syntax-highliting -> post es halt hier - du kannst es danach noch immer rauseditieren, wenn dir so ist.
btw. was haben 2 buttons mit nem counter zu tun? komplett fail sind auch die default-werte für die positionen. ne gleitkommazahl zu nehmen ist auch nicht so extrem klug, weil sie eben nicht sonderlich genau ist - können also durchaus mal nen paar mehr oder weniger steps sein(und wenns ganz dumm läuft, dann auch unendlich viele)... viel mehr hab ich mir aber nicht angeguckt...bb
-
Ich kann dir ein minimiertes Beispiel geben, nur das wird dir nicht helfen, da das funktioniert. Unter anderem deswegen nannte ich diesen Thread "unerklärlich..."
Aber wenn du ein funkionierendes Beispiel willst, bitte:
#include <iostream> using namespace std; class Point { public: double x; double y; Point( double xy = 0 ) : x( xy ), y( xy ) {} Point( double nx, double ny ) : x( nx ), y( ny ) {} Point( const Point &p ) : x( p.x ), y( p.y ) {} ~Point( ) {} Point& operator=( double xy ) { this->x = xy; this->y = xy; return *this; } }; class Style { protected: Point size; public: Style( ) { this->reset(); } ~Style( ) {} void reset() { this->size = 10; } bool setSize( const Point &newSize ) { if( newSize.x == 0 || newSize.y == 0 ) return false; this->size = newSize; return true; } bool setSize( double x, double y ) { return this->setSize( Point( x, y ) ); } }; class ElementA : public Style { public: ElementA( ) : Style() {}; ~ElementA( ) {} }; class ElementB : public Style { private: ElementA *elem; public: ElementB( ) : Style(), elem( NULL ) { this->elem = new ElementA(); } ~ElementB( ) {} void draw( ) { Point s( 2, 3 ); this->elem->setSize( s ); //Funktioniert this->elem->setSize( 15, 23 ); //Funktioniert ebenfalls } }; int main() { ElementB elem; elem.draw(); cout << "Hallo..." << endl; return 0; }Aber im Originalcode funkioniert es eben nicht mit
setSize( s ).. bei diesem Funktionsaufruf stürtzt es ab.
-
das ist schon klar, dass der funktionsaufruf an sich nicht falsch ist - aber da hier keiner lust hat, sich 100de von zeilen fremden codes anzugucken, musst du halt selbst suchen... wenn du das ganze dann zumindest ein wenig minimiert hast, wird sich auch wer finden, der deinen fehler sucht...
bb
edit: wie wärs eigtl mal mit der main.cpp am anfang?
-
Na gut, wenn das so ist noch ein paar Links von mir:
Link
Link
Link
Und ansonsten gaaaanz wichtig:
Link
-
Besonders die letzte Seite finde ich gut -)
Wahrsager:
Ich habe eine gute und eine schlechte Nachricht für Sie.
Die Gute: sie gewinnen nächste Woche viel Geld!Die Schlechte: sie sterben vorher bei einem Unfall.
-
btw. was haben 2 buttons mit nem counter zu tun? komplett fail sind auch die default-werte für die positionen. ne gleitkommazahl zu nehmen ist auch nicht so extrem klug, weil sie eben nicht sonderlich genau ist - können also durchaus mal nen paar mehr oder weniger steps sein(und wenns ganz dumm läuft, dann auch unendlich viele)
Es ist ein Counter-Element. Also sowas:
http://www.mikrocontroller.net/attachment/8990/terminal.png ( oben in der Mitte, nach "Count" )Was meinst du wo mit den Steps?
-
ein counter hat aber nichts mit irgend ner gui zu tun...
ich meine so was in etwa(gerad keinen compiler zur hand - kann also sein, dass es dummerweise gerade trotzdem geht):
startwert: 1e15
endwert: 1e16
schrittweite: 1e-16dem user (der klasse) so was zu erlauben, macht nicht viel sinn - soll er sich doch selbst drum kümmern, das umzurechnen...
ein counter sollte einfach nur zählen können - der rest hat in nem counter nix zu suchen...
ich bau doch auch keine klasse number und füg nen label mit dazu oObb
-
Mit den Steps geht es darum, dass der Counter einen Wert hat. Meinetwegen 2. Jetzt steht also eine 2 im Textfeld. Klickt der User auf den oberen Button, wird, sofern Möglich step zur der Counterzahl addiert. Klickt er auf den Unteren Button, wird step subtrahiert. Somit hat der User als Steuerelement einen Zähler. Der Endnutzer drückt die Buttons, um den Wert zu manipulieren. min und max sind dazu da, das der User grenzen hat. Verändert der User keine Daten( belässt es also bei den Default-Werten ), kann der Endnutzer in 1er Schritten von 0 bis 10 navigieren.
Da ist nichts mit unendlich viele steps oder so...
-
ChristophLu schrieb:
[versucht schlechtes design wegzuerklären, liest nicht richtig und zeigt auch sonst 0 eigeninitiative]
bye
-
So ... Problem gelöst. Es lag nicht an setSize sondern an einer Funktion, die tiefer aufgerufen wird.( Somit zu deiner 0-eigeninitiative-theorie ).
Der Fehler war da nen Segmantation fault, den ich beheben konnte.Es ist kein schlechtes Design sondern einfach nur ein Steuerelement wie ein Button, ein Textfeld oder sonst irgendwas.
-

-
Deinene Fehler hättest du aber schon viel früher, eigentlich schon vor der ganzen Diskussion, finden können, wenn du einmal mit dem Debugger durchgegangen wärst.
Und deine Klassen solltest du nochmal genauer anschauen.
Warum erben alle Klassen von Style samt virtuellen Methoden, Style hat aber keinen virtuellen Destructor?
Eine weitere Basis (die scheinbar dann auch genutzt werden soll für Elemente) basic_element wird eingeführt. redraw() gibts in Style, ein draw(Buffer, ..) erst mit basic_element.
Die Bezeichnung "Counter" ist irreführend, da nicht irgend welche Events oder sonstwas mitgezählt wird sondern eine doublebasierte Spinbox samt User-Input gemodelt wird.
Außerdem ist das mit den doubles echt ein Problem, da bedingt durch Ungenauigkeiten in der Darstellung zwei eigentlich gleiche Werte beim op== ein false liefern können, umgekehrt zwei verschiedene ein true. Damit ist nicht garantiert, dass dein Counter bei einem +2.0 auch in den Bounds bleibt.Und Rechtschreibung wäre auch nicht schlecht (das heißt "receive" und nicht "recive")
-
Ich hätte den ganzen Stylekram auch in basic_element schreiben können, hab ihn aber zur Übersicht und Trennung zum Rest ausgelagert. Den Destruktor hatte ich nicht bedacht, werde ich aber einfügen.
Alle Elemente erben noch von basic_element. Ein Vektor von den Klassen wird in einer Document-Klasse gespeichert. Per Polymorphie greife ich dann auf die wichtigsten Eigenschaften zu( z.b. draw() ).Wegen dem Vergleich meinst du diese Zeile?
if( this->current == newCurrent ) return true;Da bei einer Änderung des Wertes neu gezeichnet werden muss, wollte ich unnötiges Neuzeichnen ersparen, wenn der Wert gleich bleibt. Steht im Textfeld also 2.0 und der User will auf 2.0 setzen(
setCurrent( 2.0 )), sollte nicht neu gezeichnet werden.
Das mit den Ungenauigkeiten ist mir bekannt. Wie vergleicht man sowas trotz der Ungenauigkeiten?Meiner Meinung nach kann current nicht aus den Bounds hinausgehen, da ich die Grenzen mit <= und >= prüfe. Oder spielen die Ungenauigkeiten hier auch eine Rolle?
Problem ist: Der User soll mit dieser Spinbox auch Kommazahlen verwenden können. Also zum Beispiel:
`Step: 0.05Min: 2.0
Max: 8.45
Current: 3.75`
Sowas sollte auch Möglich sein. Hier sollen Mögliche Werte auch 2.0 und 8.45 sein.Ich dachte, es hieße Counter, aber Spinbox heißt es eigentlich. Werde ich umbenennen.( genauso wie receive )