Zum Inhalt springen

Und nochmal ich :)


TheWho

Empfohlene Beiträge

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

}

Link zu diesem Kommentar
Auf anderen Seiten teilen

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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? :rolleyes:

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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? :rolleyes:
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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Gast
Dieses Thema wurde nun für weitere Antworten gesperrt.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...