Noch ein merkwürdiger Fehler



  • Oh man... da sieht man sich den Quelltext hundert mal an und merkt das nicht 😑
    Danke für die Hilfe.

    Allerdings hab ich jetzt noch ein aller letztes Problem. ICh definiere in meiner Klasse Stone Konstanten der Klasse Color die ich auch direkt initialisiere. Wenn ich diese Objekte dann später alle verwenden will, befinden sich nur noch 0-Werte in den einzelnen Variablen für rot grün und blau.

    also ich habe den Header meiner Klasse Stone, in dem ich die Konstanten setze.

    #pragma once
    
    #include <algorithm>
    #include "Color.h"
    
    		const Color yellow = Color ( 1.0f, 1.0f, 0.0f, 1.0f );
    		const Color orange = Color ( 1.0f, 0.5f, 0.0f, 1.0f );
    		const Color green  = Color ( 0.0f, 1.0f, 0.0f, 1.0f );
    		const Color red    = Color ( 1.0f, 0.0f, 0.0f, 1.0f );
    		const Color blue   = Color ( 0.4f, 0.4f, 1.0f, 1.0f );
    		const Color black  = Color ( 0.0f, 0.0f, 0.0f, 1.0f );
    enum Side
    {
    	Front = 1, Left = 2, Back = 3, Right = 4, Top = 5, Bottom = 6
    };
    
    enum Edge
    {
    	ELeft, ETop, ERight, EBottom, Non
    };
    
    class Stone{
    	public:
    		Color color1, color2, color3;
    		enum Side side;
    		Edge edge1, edge2;
    		bool StoneUsed;
    
    		Stone();		
    		Stone(Side side, Edge edge1, Edge edge2);
    
    		void overrideStone(const Stone& stone );
    		void exchangeColors(Stone& s);
    		void switchEdgesXZ();
    		void switchEdgesYZCorner();
    		void switchEdgesXYCorner();
    	private: 
    		void getSideColor(Side side, Edge edge1, Edge edge2);
    		void getEdgeColor(Side side, Edge edge1, Edge edge2);
    		void getFrontCornerColors(Edge edge1, Edge edge2);
    		void getLeftCornerColors(Edge edge1);
    		void getRightCornerColors(Edge edge1);
    		void getBackCornerColors(Edge edge1, Edge edge2);
    		void getTopColors();
    		void getBottomColors();
    };
    

    Wenn ich dann allerdings im Konstruktor von Stone den Inhalt der Variable green abfrage, ist dieser einfach nur in jedem Feld 0 und ich bekomme nicht heraus, woran das liegt

    Stone :: Stone(Side side, Edge edge1, Edge edge2){
    	Stone::side = side;
    	Stone::edge1 = edge1;
    	Stone::edge2 = edge2;
    
    		printf("green = %f, %f, %f \n",green.r, green.g, green.b);
    
    	Stone::StoneUsed = true;
    
    	getSideColor(side,edge1,edge2);
    }
    

    Ausgabe:: green = 0.000000, 0.000000, 0.000000

    Wie die Klasse Color aussieht, kann man am vorherigen Post noch sehen. ICh hab nur die Variablen in r,g,b,a umbenannt.

    Danke ^^


  • Mod

    Kann ich nicht nachvollziehen. Wenn ich den Code um alle offensichtlichen Fehler bereinige und alles nötige zusammensetze, dann kommt auch das erwartete heraus:
    http://ideone.com/edIw6

    Bitte dritten Link in meiner Signatur lesen!

    P.S.: Guck dir mal an, was eine Initialisierungsliste ist!



  • Okay, dann hab ich nur noch um so weniger Plan, wieso es nicht funktioniert.
    Aber wenn du schon sagst, dass es klappt, wenn du alle offensichtlichen Fehler eliminierst, wäre das ja vielleicht mal ein Ansatz... Ich wüsste jetzt nichts von offensichtlichen Fehlern...


  • Mod

    Goldfish schrieb:

    Okay, dann hab ich nur noch um so weniger Plan, wieso es nicht funktioniert.
    Aber wenn du schon sagst, dass es klappt, wenn du alle offensichtlichen Fehler eliminierst, wäre das ja vielleicht mal ein Ansatz... Ich wüsste jetzt nichts von offensichtlichen Fehlern...

    Na das Semikolon, die nicht zueinander passenden Bezeicher...

    So das es überhaupt compiliert.

    Wie gesagt: Dritter Link in meiner Signatur. Du hast deinen Fehler anscheinend beim Posten herausgekürzt, dafür erschlägst du uns mit hunderten von irrelevanten Zeilen.



  • Ähm ja, deinen Verweis hab ich mir durchgelesen. Kommt nicht nochmal vor (hoffe ich). Aber ich wollte auch sicher gehen, dass ich keine Möglichkeit auslasse, da ich absolut keinen Plan hatte. Aber ich pass beim nächsten mal dann etwas mehr auf. Auf jeden Fall klappt es bei mir aus irgendeinem Grund nicht und ich kanns mir nicht erklären... ich werd mich da später nochmala mit beschäftigen. Jetzt gerade hab ich in jedem Falle erstmal die Nase voll ^^°



  • okay, ich habe jetzt rausgefunden, wo das mit der Farbe schief läuft, ich weiß nur einfach nicht, WIESO es schief läuft...
    Ich habe es wie du vorhin nochmal probiert, das Ganze in einem Testprogram laufen zu lassen und da funktioniert es bei mir auch wunderbar... Daher kann ich mir nicht erklären, was los ist.
    Ich zeige jedenfalls eben erstmal chronologisch, was passiert und was die Ausgaben dazu sind.

    std::vector<std::vector<std::vector<Stone>>> cube;
    // Diesen Vektor initialisiere ich später, werde ich hier aber nicht merh mit angeben
    

    Dann kommt als nächstes

    string col;
    	Color color = Color(green);
    	col = identifyColor(color);
    
    	printf("%s \n",col.c_str());
    	printf("%f, %f, %f \n",green.r, green.g, green.b);
    	printf("-------------------------------\n");
    
    // Hier wird ganz offensichtlich der Konstruktor von Stone aufgerufen.
    	cube.at(0).at(0).at(0) = Stone(Front, ELeft, ETop);
    
    	col;
    	color = Color(green);
    	col = identifyColor(color);
    
    	printf("%s \n",col.c_str());
    	printf("%f, %f, %f \n",green.r, green.g, green.b);
    	printf("-------------------------------\n");
    

    hier gehts dann weiter

    Stone :: Stone(Side side, Edge edge1, Edge edge2){
            ...
    
    	printf("%f, %f, %f \n",green.r, green.g, green.b);
    		printf("-------------------------------\n");
    
    	getSideColor(side,edge1,edge2);
    
    	printf("%f, %f, %f \n",green.r, green.g, green.b);
    		printf("-------------------------------\n");
    }
    

    und die Ausgabe auf der Konsole ist folgende:

    green
    0.000000, 1.000000, 0.000000
    -------------------------------
    0.000000, 0.000000, 0.000000
    -------------------------------
    0.000000, 0.000000, 0.000000
    -------------------------------
    green
    0.000000, 1.000000, 0.000000
    -------------------------------

    also aus irgendeinem Grund spackt er rum, wenn die Klasse Stone aufgerufen wird. Vorher und nachher ist ja alles okay...
    Hat irgendwer einen Plan, wieso sowas passieren kann?


  • Mod

    Ich rate mal: Das green in Stone ist ein anderes green. Mehr als Raten geht nicht ohne Code.



  • leider nein. Es gibt keine andere Variable green.
    Ich werd stattdessen einfach mal deinen beitrag von vorher ignorieren und werde jetzt mal die entsprechenden Codestücke posten die ich dazu habe.

    Die Headerdatei Cube.h

    #pragma once
    
    #include "Stone.h"
    #include <string>
    #include <vector>
    
    class Cube{
    	public:
    		std::vector<std::vector<std::vector<Stone>>> cube;
    		int cubesize;
    		Cube() {  }
    		Cube(int cubesize);
    		static std::string identifyColor(Color& color);
    	private:
    		bool isCorner(int x, int y, int z);
    		void setStone(int x, int y, int z);		
    };
    

    Die entsrechende .cpp Datei

    #include "Cube.h"
    
    using namespace std;
    
    	Cube :: Cube(int sizeOfCube)
    	{
    		cubesize = sizeOfCube;
    
    		for(int x = 0; x < cubesize; x++)
    		{
    			vector<vector<Stone>> side (cubesize);
    			cube.push_back(side);
    			for(int y = 0; y < cubesize; y++)
    			{
    				vector<Stone> line (cubesize);
    				cube.at(x).push_back(line);
    				for(int z = 0; z < cubesize; z++)
    				{   
    					cube.at(x).at(y).push_back(Stone());
    				}				
    			}
    		}
    
    		// Stein vorne oben links mit Farben grün-rot-gelb
    
    		string col;
    		Color color = Color(green);
    		col = identifyColor(color);
    
    		printf("%s \n",col.c_str());
    		printf("%f, %f, %f \n",green.r, green.g, green.b);
    		printf("-------------------------------\n");
    
    		cube.at(0).at(0).at(0) = Stone(Front, ELeft, ETop);
    
    		col;
    		color = Color(green);
    		col = identifyColor(color);
    
    		printf("%s \n",col.c_str());
    		printf("%f, %f, %f \n",green.r, green.g, green.b);
    		printf("-------------------------------\n");
    	... // alles darunter ist aktuell auskommentiert
    

    und obwohl der Rest durch oben schon bekannt ist, füg ich es trotzdem nochmal hinzu, damit man sich das Scrollen sparen kann

    #pragma once
    
    #include "Color.h"
    #include <algorithm>
    
    		const Color yellow = Color ( 1.0f, 1.0f, 0.0f, 1.0f );
    		const Color orange = Color ( 1.0f, 0.5f, 0.0f, 1.0f );
    		const Color green  = Color ( 0.0f, 1.0f, 0.0f, 1.0f );
    		const Color red    = Color ( 1.0f, 0.0f, 0.0f, 1.0f );
    		const Color blue   = Color ( 0.4f, 0.4f, 1.0f, 1.0f );
    		const Color black  = Color ( 0.0f, 0.0f, 0.0f, 1.0f );
    
    enum Side
    {
    	Front = 1, Left = 2, Back = 3, Right = 4, Top = 5, Bottom = 6
    };
    
    enum Edge
    {
    	ELeft, ETop, ERight, EBottom, Non
    };
    
    class Stone{
    	public:
    		Color color1, color2, color3;
    		Side side;
    		Edge edge1, edge2;
    		bool StoneUsed;
    
    		Stone();		
    		Stone(Side side, Edge edge1, Edge edge2);
    
    		... // das ist alles unwichtig
    };
    
    Stone :: Stone(Side side, Edge edge1, Edge edge2){
    	... // nur initialisierungen	
    
    	printf("%f, %f, %f \n",green.r, green.g, green.b);
    		printf("-------------------------------\n");
    
    	getSideColor(side,edge1,edge2);
    
    	printf("%f, %f, %f \n",green.r, green.g, green.b);
    		printf("-------------------------------\n");
    }
    
    ... // auch alles uninteressant
    

    Und die Klasse Color is ja klar. Hattest du ja auch schon getestet.

    Im Prinzip wird nur ein Objekt der Klasse Cube erzeugt und im Folgenden gehts halt schief...


  • Mod

    Goldfish schrieb:

    Ich werd stattdessen einfach mal deinen beitrag von vorher ignorieren und werde jetzt mal die entsprechenden Codestücke posten die ich dazu habe.

    Ja, das ist eine sehr zielorientierte Methode 🙄 . Wenn man denn mal 15 Minuten investiert hat, um deinen Dreck zum laufen zu bekommen, dann funktioniert's auch:
    http://ideone.com/JHc2K

    Da du offensichtlich nicht willens bist, irgendetwas selber zu tun, sondern darauf wartest, bis dir irgendein Mitleidiger deine Probleme wegzaubert, verabschiede ich mich mal aus dem Thread...



  • lol... ich weiß noch immer nicht was los ist, aber ich habs gelöst...
    Ich hab einfach ein neues Projekt erstellt, die Dateien in das neue Projekt eingefügt und siehe da, der Fehler ist weg...
    auf einmal funktioniert es... also wenn das mal nicht unlogisch ist...


Anmelden zum Antworten