Variable verändert sich auf 'mystische Weise'



  • Hey ho!
    Habe ein Problem: Ich habe eine Variable, die ich in einer Klasse deklariere, im Konstruktor definiere und über eine getVariable() Funktion return'e. ich poste hier mal die Codeschnipsel:

    Es handelt sich um die beiden variabeln Int's aiAttack und aiDefend
    Die Klasse mit Konstruktor

    class player
    {
    
    private:
    
    	int initNumber;
    	int iStatusToPlayer;
    	int iStatusToAi[12];
    	int prosperty;
    	int forceStrength;
    	int development;
    	int timesTradedWithPlayer;
    	int timesPlayerRejectedOffer; 
    
    	float aiWood,
    		aiStone,
    		aiIron,
    		aiGold,
    		aiFood,
    		aiHumor;
    
    	int aiDefend,
    		aiAttack;
    	int
    		aiInhabitants;
    
    		// True = Verbündet / False = /
    
    public:
    	char *name;
    	bool bStatusToPlayer;		//Enemy or Friend? True = Feind False = Neutral
    	bool bStatusToPlayerAlly;	// Verbündeter?	
    	bool bStatusToAi[9];		// True = Neutral / False = Feind
    	bool bStatusToAiAlly[9];
    
    	player(char* _name)  : name(_name)
    	{
    		this->iStatusToPlayer = 0;
    		this->prosperty = 0;
    		this->forceStrength = 0;
    		this->aiWood = 100;
    		this->aiStone = 100;
    		this->aiIron = 100;
    		this->aiFood = 100;
    		this->aiGold = 100;
    		this->aiHumor = 1.0f;
    		this->aiInhabitants = 100;
    		this->development = 5.000f;
    		this->timesTradedWithPlayer = 0;
    		this->timesPlayerRejectedOffer = 0;
    		this->aiAttack = 300;
    		this->aiDefend = 300;
    
    		for(int i = 0; i<sizeof(this->bStatusToAi);i++)
    		{
    			this->bStatusToAi[i] = true;
    			this->bStatusToAiAlly[i] = false;
    		}
    		this->bStatusToPlayer = false;
    		this->bStatusToPlayerAlly = false;
    }
    

    Hier die return Funktionen:

    int player::getAttack()
    {
    	return aiAttack;
    }
    int player::getDefend()
    {
    	return aiDefend;
    }
    

    Und hier der Aufruf der Variabel:

    attack = nympth.getAttack();
    	defend = nympth.getDefend();
    	cout << "aiAttack: " << attack << endl;
    	cout << "aiDefend: " << defend << endl;
    

    So. Nun hier die Ausgabe:

    aiAttack: 0
    aiDefend: 1065353216
    

    Und hier die Verweise der variabeln:

    player.cpp(95): //this->aiDefend += (aiDefend/100)*forceStrength;
    player.cpp(95): //this->aiDefend += (aiDefend/100)*forceStrength;
    player.cpp(297): return aiDefend;
    player.h(25): int aiDefend,
    player.h(55): this->aiDefend = 300;
    

    Also, da wird im Programm nichts dran geändert. Wie kommt es dann jedoch, dass die Ausgaben nicht, wie gewollt, 300 sind?!

    Vielen Danke!



  • Wo werden denn die Variablen attack und defend deklariert?



  • Bist du sicher dass dieser Konstruktur aufgerufen wird?

    player(char* _name)
    


  • Der Konstruktor wird doch aufgerufen, wenn ein Objekt erschaffen wird, oder?
    Ich erschaffe die Objekte in den Deklarationen der main.cpp

    player tammo("Tammo");
    player ariana("Ariana"), gregor("Gregor"), malark("Malark"), skott("Skott"), finmor("Finmor"), tresla("Tresla"), isabell("Isabell"), nympth("Nympth");
    

    @Taeli: Im ersten Code Ausschnitt unter Private.



  • EiGelbb schrieb:

    @Taeli: Im ersten Code Ausschnitt unter Private.

    Hm, ich seh immer noch keine Deklaration. 😕

    Hab den Code ausprobiert, und bis auf die Tatsachen, dass ich vor attack und defend noch ein int packen musste und noch ein } vergessen wurde, kriege ich 300 ausgegeben.



  • EiGelbb schrieb:

    Der Konstruktor wird doch aufgerufen, wenn ein Objekt erschaffen wird, oder?

    Richtig.

    Also, nachdem ich die 10 Compilerfehler beseitigt habe, funktioniert es bei mir tadellos.

    edit: Was vielleicht sein könnte, dass bei dir bool nicht 1 Byte groß ist und du dann ziemlich viele Speicherzugriffsverletzungen in der for-Schleife hast, vielleicht wird dort dann dein Variablenwert überschrieben.



  • sizeof(this->bStatusToAi)
    

    Damit überschreibst du dir den Stack, sofern sizeof(bool) != 1 ist...

    Insgesamt ist das Klassendesign außerdem nicht gut (da du keine constness einsetzt, unnötigerweise public Member definierst und zu viele private Member hast - ordne diese und packe sie in entsprechende Sub-Klassen/Strukturen).



  • Danke! Gleich mal testen!

    Wie teilt man so eine Klasse den sinnvoll auf? Die Lehrbücher vermitteln halt leider immer nur die Theorie und weniger die Praxis...



  • EiGelbb schrieb:

    Danke! Gleich mal testen!

    Wie teilt man so eine Klasse den sinnvoll auf? Die Lehrbücher vermitteln halt leider immer nur die Theorie und weniger die Praxis...

    Was für ein Buch hast du denn?



  • Immer diese Fragen 😃
    NEIN, nicht C++ von A bis Z. 😃

    Irgendeins von Helmut Erlenköttel (Objektorientiertes Programmieren mit C++ oder so), C++ für Spieleprogrammierer und ein paar Online-Tuts...

    Wo ich schonmal hier bin:

    Wollte in die Grafikprogrammierung einsteigen, da ich nächstes Jahr Computervisualistik oder normal Informatik studieren werde (bzw will).
    Welche API ist denn am meisten verwendet? Hatte schon kurz mit OpenGL angefangen, mich aber ziemlich dadurch entmutigen lassen, dass das seeehr veraltet ist und in der modernen Spieleprogrammierung nicht mehr verwendet wird. Und wenn ich nach DirctX suche, lese ich immer, dass es sehr schwer sei. Und lt. Amazon scheint es kein gescheites Buch über eines der Themen zu geben, da min. 10% der Rezensionen besagen, dass das Buch veraltet ist.

    Wie steige ich denn nun am besten ein? wxWidgets? OpenGL? DirectX?

    Zukünftig würde nach meinem Studium gerne eine Ausbilung in einem Entwicklerstudium anfangen und mich halt der modernen 3D-Spieleprogrammierung widmen.

    LG



  • €: Und wie kann ich das umgehen?



  • Eigelbb schrieb:

    €: Und wie kann ich das umgehen?

    Das mit dem STack überschreiben?
    Du weißt doch, dass das Array 9 Elemente enthält, dann schreib doch auch 9 hin. Und wenn du das später evtl. ändern willst, mach dir doch ein #define oder (besser) const int NUM_ELEMS o.Ä, und verwende das statt der hartkodierten "9".



  • arghonaut schrieb:

    Eigelbb schrieb:

    €: Und wie kann ich das umgehen?

    Das mit dem STack überschreiben?
    Du weißt doch, dass das Array 9 Elemente enthält, dann schreib doch auch 9 hin. Und wenn du das später evtl. ändern willst, mach dir doch ein #define oder (besser) const int NUM_ELEMS o.Ä, und verwende das statt der hartkodierten "9".

    Oder einfach sizeof(bStatusToAi)/sizeof(bStatusToAi[0]) oder einfach std::vector benutzen.


Anmelden zum Antworten