Vererbung und Protectete Werte



  • Hallo
    also ich habe folgendes Problem:
    ich bin da bei ein SudokuLösungsProgramm zu schreiben:

    class Sudoku
    {
    public:
    
     ...
    
    protected:
     unsigned short int sudokuZiffern[HOEHE][BREITE]; // Beinhaltet die gesammten Daten(Ziffern)
    
    };
    
    class KI :public Sudoku
    {
    public:
       ...
     bool einfacheMethode(int hoehe,int breite);
    
    };
    

    in der Funktion "einfacheMethode(int hoehe,int breite)" will ich den Wer von "sudokuZiffern[hoehe][breite]" verändern. Das habe ich so realisiert:

    bool KI::einfacheMethode(int hoehe,int breite)
    {
      vector<unsigned short int> moeglicheZif=moeglicheZiffern(hoehe,breite);
      ...
    
      sudokuZiffern[hoehe][breite]=moeglicheZif[0];
    
      ....
    }
    

    Ich habe aber eine Vorher Nachher Ausgabe gemacht und es Hatt sich nichts an "sudokuZiffern[][]" geändert 😕

    Wie kann ich das realisieren (habe auch get- bzw set- Methoden verwendet -> genau das selbe)

    PLZ help 😋



  • ? Also die Werte verändern sich dann wenn dann in dem AI(KI wäre Deutsch -.-) Objekt ...



  • #include <iostream>
    #include "sudoku.h"
    #include "KI.h"
    using namespace std;
    
    int main()
    {
     KI sudoku;
     sudoku.leseDatenVonEingabe();
     sudoku.schreibeDatenInAusgabe();
    
     sudoku.einfacheMethode(0,4);
     system("pause");
     sudoku.schreibeDatenInAusgabe();
    
     system("pause");
     return 0;
    }
    

    aber die beiden Ausgaben unterscheiden sich nicht.Die Funktion schreibeDatenInAusgabe() schreibt einfach den array in halt auf std::out (formatiert)

    PS: schreibeDatenInAusgabe() wird in sudoku-klasse definiert!!



  • Rainu schrieb:

    Hallo

    bool KI::einfacheMethode(int hoehe,int breite)
    {
      vector<unsigned short int> moeglicheZif=moeglicheZiffern(hoehe,breite);
      ...
    
      sudokuZiffern[hoehe][breite]=moeglicheZif[0];
      
      ....
    }
    

    Ich habe aber eine Vorher Nachher Ausgabe gemacht und es Hatt sich nichts an "sudokuZiffern[][]" geändert 😕

    Rückfrage:
    Du hast den Code geändert, so dass da

    printf( "1. sZ[%d][%d] == %d wird zu %d\n", hoehe, breite, sudokuZiffern[hoehe][breite], moegliche Zif[0] );
      sudokuZiffern[hoehe][breite]=moeglicheZif[0];
      printf( "2. sZ[%d][%d] == %d wurde zu %d\n", hoehe, breite, sudokuZiffern[hoehe][breite], moegliche Zif[0] );
    

    stand und das hat nicht funktioniert...?



  • Also in dem was du gepostet hast ist nichts zu erkennen was dazu führen sollte dass die Werte NICHT übernommen werden.
    Der Fehler muss also woanders liegen.



  • also die Methode schreibeDatenInAusgabe()
    sieht so aus:

    wiederholen);
    
       sudokuZiffern[h][b]=ziffer;
      }
     }
    }
    void Sudoku::schreibeDatenInAusgabe()
    {
     BSclear();
     cout	<< "-------------------------\n";
     for(int b=0;b<BREITE;b++)
     {
    	cout << "| ";
    	for(int h=0;h<HOEHE;h++)
       {
    	 if(h==2 || h==5 || h==8)
    	 {
    	  if(sudokuZiffern[b][h]==0) cout << "  | ";
         else cout << sudokuZiffern[b][h] << " | ";
    	 }else
    		{
    		 if(sudokuZiffern[b][h]==0) cout << "  ";
           else cout << sudokuZiffern[b][h] << " ";
    		}
       }
       cout << "\n";
    	if(b==2 || b==5 || b==8) cout	<< "-------------------------\n";
     }
    }
    

    und die funktion einfacheMethode() sieht so aus:

    bool KI::einfacheMethode(int hoehe,int breite)
    {
     vector<unsigned short int> moeglicheZif=moeglicheZiffern(hoehe,breite);
     unsigned short int anzZiffern=moeglicheZif.size();
    
     cout << anzZiffern << " ";
     if(anzZiffern==1)
     {
      sudokuZiffern[hoehe][breite]=moeglicheZif[0];
      return true;	//einfache Methode war möglich
     }
     return false; //einfache methode war nicht möglich
    }
    


  • Wer lesen kann, ist klar im Vorteil. :->

    Rainu schrieb:

    bool KI::einfacheMethode(int hoehe,int breite)
    {
     vector<unsigned short int> moeglicheZif=moeglicheZiffern(hoehe,breite);
    

    ... und hier unterbrechen wir auch mal.
    Erstmal: Breite und Höhe beschreiben hier ja eigentlich x und y und eben nicht Breite und Höhe.
    Sourcecodes sind deutlich einfacher zu lesen, wenn da steht, was man tut. Mit schlecht gewählten Variablen verwirrt man die Leute ja nur. Diese Methode dann auch noch "einfacheMethode" zu nennen, ist schon irgendwo zynisch.

    Du erzeugst hier einen Vektor, der hoehe mal den Wert von breite beinhaltet. Also bei hoehe=4 und breite 3 sieht der Vektor so aus: { 3, 3, 3, 3 }.
    Den Vektor könntest Du Dir im Verlauf des Programms also schenken und einfach

    sudokuZiffern[x][y]=x;
    

    schreiben, zumal Du eh nur die erste 3 verwendest. Ich gehe also mal davon aus, dass was immer Du hier tust, nicht das ist, was Du tuen wolltest.

    In Abhängigkeit der Größe des Vectors, machst Du eine Zuweisung. Bei x=4 und y=3 hat der Vector 4 Elemente.

    if(anzZiffern==1)
    

    Hier kommst Du nicht vorbei, um überhaupt irgendwas zu setzen.
    Deine merkwürdigen Zuweisungen funktionieren also nur, wenn Du in der ersten Reihe (y=1) etwas setzt.

    Du kommentierst so schön, dass Du zurückgibst, ob die Funktion erfolgreich war.
    Wichtiger als den Rückgabewert zu kommentieren, wäre ihn zu prüfen. Schonmal irgendwo gemacht und das Programm entsprechend reagieren lassen??
    Statt jedes Return zu kommentieren, kommentiere mal die Funktion. Lies was sie macht, kommentiere das und überlege Dir dann ob in den Kommentaren das steht, was Du programmieren wolltest. ^^

    Und mir erkläre doch mal, was Du da eigentlich programmieren wolltest!?

    Edit: Wo ich schon am meckern bin. In Deiner Signatur steht http:\\blabla. Das Internet ist keine NTFS-formatierte Festplatte und funktioniert zum Glück auch nicht als Windowsfreigabe. ^^



  • OK erstens einfacheMethode deshalb weil ich wie gesagt ein SudokuLösungsProg schreiben will. EinfacheMethode bedeutet "Ist nur eine Ziffer möglich schreibe sie hinein"(wie hätte ich sie den sonnst nennen sollen)

    Das mit breite und höhe mag stimmen ich bin auch am überlegen das zu ändern.

    Das mit dem Vector:
    Also der vector deswegen weil die Methode moeglicheZiffern(hoehe,breite) einen vector zurückgiebt. Diese Methode schreibt ALLE Möglichen ziffern in den vector. Das heißt ich weis noch nicht wie groß der Vektor ist. Deswegen habe ich auch erstaml einen vector gemacht der nur in der Funktion einfacheMethode() genutzt wird. Mit diesem Vector prüf ich ab ob der Vektor EINE Ziffer enthält wenn ja SOLL er diese Ziffer in das entsprechende Feld sudokuZiffern[][] eintragen.(was ja mein Problem ist denn das Funtzt nicht) Wenn der vektor mehr als eine Ziffer enthält soll er nichts machen nur FALSE zurückliefern.

    Und ja ich habe das Prog schon mit einer Endlosschleife Probieren lassen die etwa so aussah:

    while(einfacheMethode(x,y))
    {
     cout << ".\n";
    }
    


  • OKEY das thema hatt sich erledigt habe nur 2 werte Vertauscht -.-



  • Rainu schrieb:

    OK erstens einfacheMethode deshalb weil ich wie gesagt ein SudokuLösungsProg schreiben will. EinfacheMethode bedeutet "Ist nur eine Ziffer möglich schreibe sie hinein"(wie hätte ich sie den sonnst nennen sollen)

    Die Funktion prüft aber nicht, was möglich ist, die Funktion ist eher aufgebaut wie ein Setter.

    Rainu schrieb:

    Das mit breite und höhe mag stimmen ich bin auch am überlegen das zu ändern.

    Würde die Funktion prüfen, was möglich wäre, so bräuchtest Du keine Positionen zu übergeben, weil die Methode sie ja selber finden müsste.

    Rainu schrieb:

    Das mit dem Vector:
    Also der vector deswegen weil die Methode moeglicheZiffern(hoehe,breite) einen vector zurückgiebt.

    ??
    Die gepostete Methode gibt ein Bool zurück und sonst nix.

    Rainu schrieb:

    Diese Methode schreibt ALLE Möglichen ziffern in den vector.

    Nein, nur den Wert, der in Breite steht und danach wird der Vektor wieder zerstört.
    Schau Dir mal den Konstruktor an, den Du für den Vector aufrufst.

    Rainu schrieb:

    Das heißt ich weis noch nicht wie groß der Vektor ist. Deswegen habe ich auch erstaml einen vector gemacht der nur in der Funktion einfacheMethode() genutzt wird. Mit diesem Vector prüf ich ab ob der Vektor EINE Ziffer enthält wenn ja SOLL er diese Ziffer in das entsprechende Feld sudokuZiffern[][] eintragen.(was ja mein Problem ist denn das Funtzt nicht) Wenn der vektor mehr als eine Ziffer enthält soll er nichts machen nur FALSE zurückliefern.

    Das funzt nicht, weil Du das nicht programmiert hast.
    Was Du programmiert hast, hat überhaupt nichts mit Deiner hier stehenden Beschreibung zu tun.

    Mach's doch umgekehrt. Schreibe die Kommentare und dazwischen der Code, der tut, was Du zuvor kommentiert hast.
    Versuche aber wenigstens vorher nachzuvollziehen, was Du da eigentlich programmiert hast.

    Rainu schrieb:

    Und ja ich habe das Prog schon mit einer Endlosschleife Probieren lassen die etwa so aussah:

    while(einfacheMethode(x,y))
    {
     cout << ".\n";
    }
    

    Ich hoffe, es sah nicht genauso aus, denn da wird in der Regel nicht viel passieren und wenn's dann dochmal klappt, wäre ein "if( einfacheMethode( x, y ) ) cout << "Hat geklappt";" vielleicht praktischer.

    Wozu eine Endlosschleife für immer die gleiche Abfrage?

    while( y == 1 )
    {
     cout << ".\n";
    }
    

    wäre kürzer und - abgesehen davon, dass eine Speicherstelle laufend mit x maltretiert wird - gleichwertig.


Anmelden zum Antworten