Vector wird nicht richtig zurückgegeben



  • Hallo.

    Ich bin gerade dabei ein Programm zu schreiben, welches ein Sodoku lösen soll.
    Dazu erstelle ich gerade ne Klasse, die Sodoku heißt und dementsprechend auch das darstellen soll. Bei einer Methode, die nur eine Spalte aus dem Feld zurückgeben soll hakts allerdings schon, da der lokale Vector in der main, in den der zurückgegebene kopiert werden sollte leer ist. Bei der Methode, die eine Reihe zurückgibt habe ich keine Probleme.
    Der Vector, den die Spaltenmethode erstellt existiert auch richtig, wird nur nicht richtig zurückgegeben. Aber ein paar Zeilen Code sagen ja bekanntlich mehr, also will ich ihn nicht vorenthalten:

    #include <iostream>
    #include <vector>
    
    using namespace std;
    
    void show_vector(vector<int>& rvector)
    {
    	for(int n = 0; n < rvector.size(); n++)
    		cout << rvector[n];
    }
    
    class Sodoku
    {
    	//Eigenschaften
    	//
    	//9x9 Feld
    	//
    	vector<vector<int> > field;
    
    public:
    
    	//Konstruktor 
    	//
    	Sodoku()
    	{
    		//Begrüßungsbildschirm
    		//
    		cout << "_____________________________________\n" <<
    			"\tSodoku-Loesungsprogramm\n" <<
    			"___________________________________________\n\n";
    
    		cout << "-Geben sie die bestehenden Zahlen des 9x9 Felder grossen Quadrates der Reihe nach ein-\n\n";
    
    		//Gibt dem zweidimensionalen Vector Startwerte
    		//
    		//in y-Richtung
    		//
    		field.resize(9);
    
    		//in x-Richtung
    		//
    		for(int n = 0; n < 9; n++)
    		{
    			field[n].resize(9);
    		}
    
    		int c;
    
    		//Schleife, die das Array initialisiert
    		//
    		for(int y = 0; y < 9; y++)
    		{
    			cout << y+1 << ". Reihe: ";
    
    			for(int x = 0; x < 9; x++)
    			{
    				cin >> field[y][x];
    				c = cin.get();
    			}
    		}
    
    	}
    
    	//aktuelles Feld ausgeben
    
    	void show_field()
    	{
    		cout << "\n\naktuelles Feld: \n\n";
    
    		for(int y = 0; y < 9; y++)
    		{
    			for(int x = 0; x < 9; x++)
    			{
    				cout << field[y] [x] << ' ';
    			}
    			cout << endl;
    		}
    	}
    
    	//Zugriffsmethoden
    	//
    
    	//Eine Spalte zurückgeben
    	//
    	const vector<int>& get_row(unsigned number)
    	{
    		number--;
    		if((number > 0) && (number < 9))
    			return field[number];
    	}
    
    	const vector<int>& get_column(unsigned number)
    	{
    		number--;
    
    			vector<int> column(9);
    
    			for(int n = 0; n < 9; n++)
    			{
    				column[n] = field[n][number];
    			}
    
                            //Ausgabe des Vectors innerhalb der Funktion.
    			show_vector(column);
    			return column;
    	}
    };
    
    int main()
    {
    	Sodoku sodoku1;
    
    	sodoku1.show_field();
    
    	vector<int> vec(9);
    	vec = sodoku1.get_column(2);
    
    	show_vector(vec);
    
    	cout << vec.size();
    
            vec = sodoku1.get_row(2);
    
            show_vector(vec);
    
            cout << vec.size();	
    }
    

    Die Ausgabe von vec, nachdem er von get_row() initialisiert wurde, ist gleich der 2ten Reihe des Sodokus. Aber get_column liefert einen leeren Vector zurück. Wie kann das sein?? 😕

    Würde mich für Hilfe freuen 🙂

    freundliche Grüße, Tim 😉



  • const vector<int>& get_column(unsigned number)
    

    Du gibst eine Referenz auf das lokale column zurück. Was da passiert ist nicht definiert. Gib einfach 'ne Kopie raus.



  • Referenz auf lokales Objekt, vielleicht?
    Sollte man NIE machen.



  • Ok, ich hab mir schon überlegt, dass es daran liegen könnte, aber war mir nciht ganz sicher.
    Wie kann ich das denn umgehen?

    Ne Kopie, vermutlich von column? und wo?

    Könnte column aufm heap anlegen?



  • vector<int> getColumn...
    {
        ...
        return column; // oder C++11: return std::move(column);
    }
    


  • Nathan schrieb:

    return column; // oder C++11: return std::move(column);
    

    Selbst in C++11 würde man auf das std::move weil der Code dann langsamer wird (erzwungener Move-Konstruktor vs. nichts (NRVO)).

    @Hobby-Coder: return column kostet wegen Compiler-Optimierungen nie etwas (klick).



  • Hm, hätte man auch iwie selbst drauf kommen können, aber was nciht sein kann, was nicht sein darf..
    Naja, Danke für die Hilfe 😉



  • const vector<int>& get_column(unsigned number) 
    { 
       number--;
       ...
    }
    

    sieht auch gefährlich aus. Was passiert, wenn number 0 ist?


Anmelden zum Antworten