An die C++ Programmierer: Problem mit Array von Klasse

Übersicht Sonstiges Smalltalk

Neue Antwort erstellen

M0rgenstern

Betreff: An die C++ Programmierer: Problem mit Array von Klasse

BeitragDo, Dez 30, 2010 14:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Leute.
Ein Kumpel von mir hat für Silvester ein Mensch ärger dich nicht gelötet und gebastelt, also die elektronsichen Teile die man so kennt.
Jetzt sollte ich die Software schreiben, hab aber lange nichts mehr mit C++ gemacht.
Ich muss sagen, das ganze lief gut.
Bis ich soweit war mal ein wenig zu testen. Jetzt sehe ich, dass mir scheinbar total im Speicher rumgefuscht wird.
Zur Erklärung: Ich habe eine Klasse Player.
Davon gibts ein dynamisches Array, das einfach jeden Spieler beinhaltet, der mitspielt.
Hier ist mal die Klasse:

Code: [AUSKLAPPEN]
class Player
{
 public:
        static int iaPLayerNumbers[4]; //mögliche IDs
        static int iPlayerAmount; //Anzahl der Spieler
        static int iaPlayerAll[]; //wird nie benutzt, relikt von früher
        static const int iCharacterAmount = 4; //Anzahl der Spielfiguren
        static int iPlayingPlayer; //Spieler der an der Reihe ist

        int iNumber; //ID des Spielers
        int iNumberOfThrows; //Anzahl die er werfen darf
        int iaCharacters[]; //Array für die Figuren
        int iaBase[]; //Haus des Spielers
        int iaField[]; //Array für die Positionen auf dem Spielfeld
        int iaGoal[]; //Ziel des Spielers
       
        Player(int pNumber) //Konstruktor
        {
         iNumber = pNumber; //ID
         iNumberOfThrows = 3;
         //Arrays auf die Startwerte setzen:
         int iaCharacters[iCharacterAmount] = {-1,-1,-1,-1}; //base =1, Field = 2, Goal = 3
         int iaBase[iCharacterAmount] = {1,1,1,1};
         int iaField[iCharacterAmount] = {-1,-1,-1,-1};
         int iaGoal[iCharacterAmount] = {-1,-1,-1,-1}; 
        }
        Player()
        {
         iNumber = 0;
         iNumberOfThrows = 3;
         int iaCharacters[iCharacterAmount] = {-1,-1,-1,-1}; //base = -1, Field = 0-39, Goal = 40-43
         int iaBase[iCharacterAmount] = {1,1,1,1};
         int iaField[iCharacterAmount] = {-1,-1,-1,-1};
         int iaGoal[iCharacterAmount] = {-1,-1,-1,-1};       
        }
}


Kurz danach wird dann das Array der Klasse deklariert und noch ein paar andere Dinge für die Klasse initialisiert.
Code: [AUSKLAPPEN]
int Player::iaPLayerNumbers[4] = {2, 4, 8, 16};
int Player::iPlayerAmount = 0;
int Player::iPlayingPlayer = 0;
Player * paAllPlayer; //Hier ist das Array


Dann gibt es eine Funktion, die vor dem Spielstart das Spielerarray intialisiert und alle Spieler anlegt.
Das ist diese Funktion:
Code: [AUSKLAPPEN]
void InitPlayerClass(int pAmount)//Spieler initialisieren!
{
     if (pAmount < 1) //Grenzen einhalten.. Mindestens 1 Spieler
        pAmount = 1;
     if (pAmount > 4) //Höchstens 4 Spieler
        pAmount = 4;

     Player::iPlayerAmount = pAmount; //Spieleranzahl in der Klasse setzen
     delete[] paAllPlayer; //Array löschen
     paAllPlayer = new Player[pAmount]; //Array neu dimensionieren

     for (int i = 0; i < pAmount; i++)
         paAllPlayer[i] = Player(Player::iaPLayerNumbers[i]); //Konstruktor aufrufen

     for (int i = 0; i < pAmount; i++)
     {
          //HIER ist das Prolbem:
          for(int in = 0; in < Player::iCharacterAmount; in++)
          {
                  paAllPlayer[i].iaBase[in] = 1;   
                  paAllPlayer[i].iaField[in] = -1;
                  paAllPlayer[i].iaGoal[in] = -1;
                  paAllPlayer[i].iaCharacters[in] = -1;           
          }
         cout << "Spieler Nr.: " << i+1 << " hat die ID: " << paAllPlayer[i].iNumber<<"\n"; //Hier wird es deutlich
     }
         
         
    //Und hier auch nochmal.
     for (int i = 0; i < Player::iCharacterAmount; i++)
     {
                         cout << i << ": Basis: " << paAllPlayer[1].iaBase[i] << "\n";
                         cout << i << ": Feld: " << paAllPlayer[1].iaField[i]<< "\n";
                         cout << i << ": Ziel: " << paAllPlayer[1].iaGoal[i]<< "\n";   
     }
     
     cout << "\n";
     Player::iPlayingPlayer = TossDiceForBeginning();
     cout << "Spieler: " << Player::iPlayingPlayer << " beginnt!\n";
}


Das Problem ist folgendes: Mir ist aufgefallen, dass die Arraywerte zu Beginn, also nachdem der Konstruktor in der Funktion oben aufgerufen wurde, NICHT 1 und -1 sind sondern irgendwelche zufälligen positiven Zahlen.
Also habe ich die eine Forschleife hinzugefügt, die die Arrays nochmal auf -1 bzw 1 setzt.
Jetzt ist aber folgendes Problem aufgetreten: ALLE Arrays stehen danach auf -1 obwohl eines ja auf 1 stehen müsste. Außerdem ist die SpielerID, also paAllPlayer[i].iNumber nur bei dem ersten Spieler also paAllPlayer[0].iNumber danach noch richtig. Die anderen stehen alle auf -1.
Ich bin wirklich am verzweifeln und kann mir nicht erklären woher das kommt.

Kann mir da bitte jemand weiterhelfen? Wäre echt super.

Lg, M0rgenstern

Hummelpups

BeitragDo, Dez 30, 2010 18:59
Antworten mit Zitat
Benutzer-Profile anzeigen
mit "int array" deklarierst du sie lokal neu im konstruktorscope

M0rgenstern

BeitragDo, Dez 30, 2010 20:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Gut, das hört sich logisch an.
Dann verstehe ich aber nicht, warum er in der Funktion "InitPlayerClass" (letzter CodeTag) nach dieser Schleife:
Code: [AUSKLAPPEN]
//HIER ist das Prolbem:
          for(int in = 0; in < Player::iCharacterAmount; in++)
          {
                  paAllPlayer[i].iaBase[in] = 1;   
                  paAllPlayer[i].iaField[in] = -1;
                  paAllPlayer[i].iaGoal[in] = -1;
                  paAllPlayer[i].iaCharacters[in] = -1;           
          }


1. Alle Arrays auf -1 stehen hat und
2. Die ID aller Spieler auf -1 steht.

Das erschließt sich mir leider nicht.

Lg, M0rgenstern

maximilian

BeitragDo, Dez 30, 2010 20:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
int iaCharacters[iCharacterAmount] = {-1,-1,-1,-1}; //base = -1, Field = 0-39, Goal = 40-43
int iaBase[iCharacterAmount] = {1,1,1,1};
int iaField[iCharacterAmount] = {-1,-1,-1,-1};
int iaGoal[iCharacterAmount] = {-1,-1,-1,-1};


Du solltest dir auf jeden Fall mal ein C/C++-Tutorial durchlesen, bei deinem Code ist so einiges im Argen.

Wie bereits von Hummelpups erklärt deklarierst du hier 4 lokale Arrays ohne die Daten der Instanz zu verändern.

Außerdem reservierst du aus diesem Grund für die 4 Arraypointer nirgendwo Platz, weswegen in der for-Schleife einige total krumme Sachen passieren.
Variety is the spice of life. One day ignore people, next day annoy them.

M0rgenstern

BeitragDo, Dez 30, 2010 20:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey, danke.
Ich hab jetzt grade das Problem gelöst. Musste die Arrays als Pointer deklarieren und dann mit = new int[4]; initialisieren.

Ich hab ein C++ Buch, mich nur mit Pointern noch nie so sehr beschäftigt^^

Dankeschön.

lg, M0rgenstern
 

HavockToxx

BeitragFr, Dez 31, 2010 6:19
Antworten mit Zitat
Benutzer-Profile anzeigen
wenn man mit Classen arbeitet in C++ sind Pointer das A und O in der Suppe. Nur neben bei.

Neue Antwort erstellen


Übersicht Sonstiges Smalltalk

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group