TheWho Geschrieben 12. April 2005 Geschrieben 12. April 2005 Hallo! Nachdem ich jetzt das Problem mit dem 2dim Array gelöst habe, bekomme ich hier einen Fehler, finde aber die Quelle nicht. Vielleicht seh ich den Wald vor lauter Bäumen nicht mehr?! :cool: Das Programm läuft bis zum Schluß prima, dann jedoch geht er noch 3 Schritte weiter, obwohl er zur Main zurückkehren sollte (Abfrage auf Ende des Vektors). Ich wäre dankbar, wenn mir jemand sagen kann, wieso das Programm in den case 3 reinläuft, obwohl die lastdirection weiter auf 1 steht und ich die breaks nicht vergessen habe? LG, TheWho int matrix::goNorth(xArray *Coord) { if ( 1 == checkLimits() ) //Grenzen überschritten? return 1; if ( 0 == checkEnd( Coord ) ) //Polygon fertig return 0; cout << "last direction (goNorth2): " << this->getDirection() << endl; switch ( this->getDirection() ) { case 0: if ( this->m_iXAct <= 0 ) // für Ausgangspixel 0-0 { this->goEast(Coord); } else { if ( this->m_iXAct-1 >= 0 && this->getContent( this->m_iXAct-1, this->m_iYAct ) != this->getContent(this->m_iXAct, this->m_iYAct) ) { this->setNextBegin(this->m_iXAct-1, this->m_iYAct); this->goEast(Coord); } else { cout << "2: " <<this->m_iXAct << " - " << this->m_iYAct << endl; Coord->setXCoord(this->m_iXAct); Coord->setYCoord(this->m_iYAct); --this->m_iXAct; this->goNorth(Coord); } } break; case 1: if ( this->m_iYAct-1 >= 0 && this->getContent( this->m_iXAct, this->m_iYAct-1 ) == this->getContent(this->m_iXAct, this->m_iYAct) ) { cout << "3: " <<this->m_iXAct << " - " << this->m_iYAct << endl; Coord->setXCoord(this->m_iXAct); Coord->setYCoord(this->m_iYAct); --this->m_iYAct; this->goWest(Coord); } else { if ( this->m_iXAct-1 >= 0 && this->getContent( this->m_iXAct-1, this->m_iYAct ) == this->getContent(this->m_iXAct, this->m_iYAct) ) { cout << "4: " <<this->m_iXAct << " - " << this->m_iYAct << endl; Coord->setXCoord(this->m_iXAct); Coord->setYCoord(this->m_iYAct); --this->m_iXAct; this->goNorth(Coord); } else { if ( this->m_iYAct+1 <= this->m_zeilen && this->getContent( this->m_iXAct, this->m_iYAct+1 ) == this->getContent(this->m_iXAct, this->m_iYAct) ) { cout << "5: " <<this->m_iXAct << " - " << this->m_iYAct << endl; Coord->setXCoord(this->m_iXAct); Coord->setYCoord(this->m_iYAct); this->setDirection(2); ++this->m_iYAct; //gehe nach Osten this->goNorth(Coord); } } } break; case 2: //Nordwesten if ( this->m_iXAct-1 >= 0 && this->getContent( this->m_iXAct-1, this->m_iYAct ) != this->getContent(this->m_iXAct, this->m_iYAct) ) { cout << "6: " <<this->m_iXAct << " - " << this->m_iYAct << endl; Coord->setXCoord(this->m_iXAct); Coord->setYCoord(this->m_iYAct); --this->m_iXAct; this->setDirection(1); //zurücksetzen auf Westen this->goNorth(Coord); } else { this->setDirection(3); this->goNorth(Coord); } break; case 3: if ( this->m_iXAct <= 0 ) // für Ausgangspixel { this->goEast(Coord); } else { if ( this->m_iYAct-1 >= 0 && this->getContent( this->m_iXAct, this->m_iYAct-1 ) != this->getContent(this->m_iXAct, this->m_iYAct) ) { this->setNextBegin(this->m_iXAct, this->m_iYAct-1); this->goWest(Coord); } if ( this->m_iXAct-1 >= 0 && this->getContent( this->m_iXAct-1, this->m_iYAct ) != this->getContent(this->m_iXAct, this->m_iYAct) ) { this->setNextBegin(this->m_iXAct-1, this->m_iYAct); this->goEast(Coord); } else { cout << "7: " << this->m_iXAct << " - " << this->m_iYAct << endl; Coord->setXCoord(this->m_iXAct); Coord->setYCoord(this->m_iYAct); --this->m_iXAct; this->goNorth(Coord); } } break; default: break; } return 0; // korrektes Beenden }
Klotzkopp Geschrieben 12. April 2005 Geschrieben 12. April 2005 Das Programm läuft bis zum Schluß prima, dann jedoch geht er noch 3 Schritte weiter, obwohl er zur Main zurückkehren sollte (Abfrage auf Ende des Vektors).Leider ist weder aus der Problembeschreibung noch aus dem Code zu erkennen, was du mit "3 Schritte" meinst. Einen Vektor sehe ich auch nicht. Wenn du wenigstens auf diesen "this->"-Unsinn verzichtet hättest - ich habe den Eindruck, dein Code wäre nur noch halb so lang - und auf eine ordentliche Einrückung geachtet hättest, dann wäre Code halbwegs lesbar geworden. Aber so verstehe ich nicht im geringsten, wo das Problem liegt. Der Betreff, den du gewählt hast, hilft auch nicht weiter. "Und nochmal ich :)" sagt nichts über das Problem aus. Normalerweise ändere ich so was ab, aber da ich bei dir absolut nicht erkennen kann, was das eigentliche Problem ist, bin ich machtlos. Also bitte: Nachbessern. Ich wäre dankbar, wenn mir jemand sagen kann, wieso das Programm in den case 3 reinläuft, obwohl die lastdirection weiter auf 1 steht und ich die breaks nicht vergessen habe? Ich nehme an: cout << "last direction (goNorth2): " << this->getDirection() << endl; [/code] Hier bekommst du als Ausgabe 1. Dir ist klar, dass case 3 vor der Ausgabe noch eine weitere Funktion aufruft (goWest oder goEast), die du zwar nicht gezeigt hast, die aber womöglich ähnliche Ausgaben erzeugen?
geloescht_Newlukai Geschrieben 12. April 2005 Geschrieben 12. April 2005 Hab' grad' gesehen, Klotzkopp war schneller. Ich stimme ihm zu. Mußt schon mehr Code zeigen. Das das Programm in den Fall 3 läuft, liegt wohl daran, daß getDirection() 3 liefert
TheWho Geschrieben 12. April 2005 Autor Geschrieben 12. April 2005 Hi, das der Titel blöd war, ist mir leider erst aufgefalllen, als ich nicht mehr editieren konnte. Tut mir leid. Bin ziemlich erkältet und wohl etwas neben der Spur... :hells: Die ordentliche Einrückung habe ich versucht, nur leider klappt das mit den html Sachen hier scheinbar nicht 100% - immer, wo ich Leerzeichen statt Tabs benutzt habe, war der Code wesentlich mehr eingerückt... Ließ sich dann auch nicht mehr korrigieren! Das Problem ist, daß er eben in den case-Fall 3 reingeht, obwohl getDirection() = 1 liefert. Für mich sieht es so aus, als ob er von case 1 in case 2 reinläuft, wo die Anweisung setDirection() = 3 vorkommt, und dann munter weiter in case 3. Das dürfte doch aber mit den breaks nicht sein, oder? Ich würde gern auf den "this-> Unsinn" verzichten, wenn ich es besser wüßte :confused: Nur steh ich gerade am Anfang mit meinen C++ Kenntnissen, und dachte, so wäre es richtig. Die gezeigte Methode ist eine von vier, die jeweils die "direkten Nachbarn" aller Richtungen eines 2dim Arrays ansehen, machen aber im Prinzip das gleiche. Ich hoffe, es ist jetzt etwas klarer?
beliar Geschrieben 12. April 2005 Geschrieben 12. April 2005 Hi, [...] Ich würde gern auf den "this-> Unsinn" verzichten, wenn ich es besser wüßte :confused: Nur steh ich gerade am Anfang mit meinen C++ Kenntnissen, und dachte, so wäre es richtig. [...] this ist nur nötig wenn man eine lokale variable hat mit den gleichen namen wie die variable der klasse auf die man zugreifen möchte. ansonsten kannste 'this->' einfach weglassen also anstatt this->Variable nur Variable
Klotzkopp Geschrieben 12. April 2005 Geschrieben 12. April 2005 Das Problem ist, daß er eben in den case-Fall 3 reingeht, obwohl getDirection() = 1 liefert.Woraus schließt du, dass "er" in den case 3 reingeht? Hast du das mit dem Debugger geprüft? Ich würde gern auf den "this-> Unsinn" verzichten, wenn ich es besser wüßte :confused: Nur steh ich gerade am Anfang mit meinen C++ Kenntnissen, und dachte, so wäre es richtig.Wie beliar schon sagte, du brauchst "this->" nur dann, wenn du auf eine lokale Variable zugreifen willst, die genause heißt wie eine Membervariable. Für Methodenaufrufe brauchst du es auf keinen Fall. Vermutlich kannst du in deinem Code jedes this-> einfach löschen. Die gezeigte Methode ist eine von vier, die jeweils die "direkten Nachbarn" aller Richtungen eines 2dim Arrays ansehen, machen aber im Prinzip das gleiche. Was meinst du mit "ansehen"? Ich bin nicht in der Lage, aus dem Code zu erkennen, was der Zweck des Ganzen ist. Ich vermute aber, dass man den ganzen Code auf etwa 10% der Größe zusammenstreichen könnte. Ich hoffe, es ist jetzt etwas klarer? Nein, leider nicht. Es ist immer noch nicht klar, was der Code tun soll. Was bedeuten die cases überhaupt? Warum die leichten Unterschiede in den 4 case-Blöcken? Nach welchem System rufst du setDirection oder setNextBegin auf? Ist die Rekursion beabsichtigt?
TheWho Geschrieben 12. April 2005 Autor Geschrieben 12. April 2005 Woraus schließt du, dass "er" in den case 3 reingeht? Hast du das mit dem Debugger geprüft? Weil ich die entsprechende Ausgabe des Programms bekomme. Da brauchte ich nichts zu debuggen. Danke, das hatte beliar ja bereits erklärt und ich werde versuchen, das umzusetzen. Den Inhalt der benachbarten Array-Elemente auslesen. Ich wollte von Euch auch kein Codereview, sondern nur eine Hilfestellung über offensichtliche syntaktische Fehler. Das glaube ich nicht. Dafür müßte ich Dir meinen gesamten Algorithmus erklären, das würde hier wohl etwas den Rahmen sprengen. Ja. Wenn es nicht möglich ist, mit einem Codeschnipsel den Fehler zu finden, dann sperre bitte den Thread. Ich hatte nicht gedacht, daß es so schwer ist. Tut mir leid.
PuppetMaster Geschrieben 12. April 2005 Geschrieben 12. April 2005 Weil ich die entsprechende Ausgabe des Programms bekomme. Da brauchte ich nichts zu debuggen. Puh, was ein Glück. Fast hättest du dir Arbeit gemacht! Ne mal im Ernst, du bist dir bewusst, dass nach dem Zeitpunkt wo du getDirection() aufrufst, vielleicht noch irgendeine andere Funktion aufgerufen werden könnte, die genau diesen Fehler produziert? Geh das einfach mal mit dem Debugger durch, dann wirst du auch sehen wo der Fehler liegt. Desweiteren, da sind evtl semantische und nicht nur syntaktische Fehler dran schuld. BTW: Du kannst dir sicher sein, dass dein Code garantiert um 50% reduziert werden kann. Egal ob du das glaubst oder nicht.
Klotzkopp Geschrieben 12. April 2005 Geschrieben 12. April 2005 Weil ich die entsprechende Ausgabe des Programms bekomme. Da brauchte ich nichts zu debuggen.Die Ausgabe von rekursiven Funktionen kann verwirrend sein. Vertrau mir. Den Inhalt der benachbarten Array-Elemente auslesen.Zu welchem Zweck? Was soll dabei am Ende rauskommen? Der Rückgabewert ist ja immer 0. Ich wollte von Euch auch kein Codereview, sondern nur eine Hilfestellung über offensichtliche syntaktische Fehler.Syntaktische Fehler hast du nicht drin, sonst würde sich der Compiler beschweren. Offensichtlich ist nur, dass du dringend ein Codereview brauchst, dann käme man den logischen Fehlern viel einfacher auf die Schliche. Das glaube ich nicht.Wir sind aber nicht in der Kirche Als jemand, der nach eigener Aussage mit seinen C++-Kenntnissen gerade am Anfang steht, solltest du den Leuten hier - die teilweise mehrere Jahre Erfahrung haben - etwas mehr zutrauen, und deinem Bauchgefühl (prüfen willst du ja nicht) etwas weniger. Dafür müßte ich Dir meinen gesamten Algorithmus erklären, das würde hier wohl etwas den Rahmen sprengen.Der Zweck wäre für den Anfang schon ausreichend. Wenn es nicht möglich ist, mit einem Codeschnipsel den Fehler zu finden, dann sperre bitte den Thread.Es liegt weniger an dem Codeschnipsel, als daran, dass der Zweck des Codes nicht klar ist, und du auf Erkenntnissen beharrst, die IMHO aus Bauchgefühlen gewonnen wurden. Wenn du noch etwas beitragen möchtest, PN an mich. -> Geschlossen.
Empfohlene Beiträge