[C++] Element struct verdwijnt magisch

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • kunnen
  • Registratie: Februari 2004
  • Niet online
Ik ben C++-code aan het schrijven om een boom te genereren voor het oplossen van een speltheoretisch probleem. Het komt erop neer dat ik een struct heb:
C++:
1
2
3
4
5
6
struct Node
{
  bool playersOut[5];
  int playerLevel[5];
  Node *child[3];
};

Deze is dus gelinkt aan 3 child-nodes, die weer gelinkt zijn, etc. Deze genereer ik alsvolgt:
Start:
C++:
1
2
3
4
5
6
7
8
  Node *base = new Node;
  for(int i=0; i<5; i++)
  {
    base->playersOut[i] = false;
    base->playerLevel[i] = 0;
  }
  cout << "Starting the tree...\n";
  BuildTreeRecursive(base, 0, 0);

Takken:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
void BuildTreeRecursive(Node* parent, int level, int player)
{
  for(int i=0; i<3; i++)
    for(int j=0; j<5; j++)
    {
      Node* temp = new Node;
      temp->playersOut[j] = parent->playersOut[j];
      temp->playerLevel[j] = parent->playerLevel[j];
      parent->child[i] = temp;
    }
  [..] //Recursie, irrelevant voor probleem
}

Het probleem is nu dat na deze twee for-lussen, volgens de debugger het volgende geldt:
code:
1
2
3
4
parent->child[2]->playerLevel[0]
-842150451
parent->playerLevel[0]
0
(evenals de andere playerLevels)

Dit probleem treedt daarnaast alleen op als ik in Visual Studio het project als Debug-project compileer, de Release versie lijkt dit probleem niet te hebben. Als ik namelijk de debugversie in de console draai is hij snel klaar (door de fouten), en de release-versie draait een lange tijd door.

Heeft iemand enig idee wat hier het probleem kan zijn? Ik ben hier nu al >2 uur naar aan het staren en ondanks het toevoegen van vele cout's en assert's kan ik er niet achter komen wat er fout is...

Edit: Het blijft zelfs zo als ik de loop verander in:
C++:
1
2
3
4
5
6
7
8
  for(int i=0; i<3; i++)
    for(int j=0; j<5; j++)
    {
      Node* temp = new Node;
      temp->playersOut[j] = 1;
      temp->playerLevel[j] = 1;
      parent->child[i] = temp;
    }

[ Voor 8% gewijzigd door kunnen op 05-12-2008 01:13 ]


Acties:
  • 0 Henk 'm!

  • writser
  • Registratie: Mei 2000
  • Laatst online: 26-09 15:38
Je probleem is dat je de Node's aanmaakt in de binnenste for-lus. Je maakt nu 15x een nieuwe temp aan. De eerste vier stop je in parent->child maar die wordt de volgende iteratie weer overschreven (memory leak). Wat je (denk ik) wil is:

C++:
1
2
3
4
5
6
7
8
for(int i=0; i<3; i++) {
  Node* temp = new Node();
  for(int j=0; j<5; j++) {
      temp->playersOut[j] = parent->playersOut[j];
      temp->playerLevel[j] = parent->playerLevel[j]; 
    }
    parent->child[i] = temp;
}


1x Een node aanmaken, 5x alle waarden kopieren en de Node opslaan in de parent. En dat 3x.

[ Voor 13% gewijzigd door writser op 05-12-2008 01:32 ]

Onvoorstelbaar!


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 02:49

.oisyn

Moderator Devschuur®

Demotivational Speaker

Euh, volgens mij wil je de nieuwe node en de assignment aan parent->child juist buiten de binnenste loop doen. Zo dus:
C++:
1
2
3
4
5
6
7
8
9
10
11
  for(int i=0; i<3; i++) 
  {
    Node* temp = new Node; 
    for(int j=0; j<5; j++) 
    { 
      temp->playersOut[j] = parent->playersOut[j]; 
      temp->playerLevel[j] = parent->playerLevel[j]; 
    } 
    parent->child[i] = temp; 
    // ...
  }


Nu maak je voor iedere child 5x een nieuwe node, en in die nieuwe node stel je maar voor 1 element de playersOut en playersLevel in. Vervolgens assign je al die 5 nodes aan child[i], met als resultaat dat je de eerste 4 kwijt bent en de laatste overhoudt (waarin de elementen 0 t/m 3 van playersOut en playerLevel ongeïnitialiseerd blijven).

.edit @ writser: pff voordringer :P

[ Voor 8% gewijzigd door .oisyn op 05-12-2008 11:30 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • writser
  • Registratie: Mei 2000
  • Laatst online: 26-09 15:38
offtopic:
sneller typen :)

[ Voor 4% gewijzigd door writser op 05-12-2008 01:33 ]

Onvoorstelbaar!


Acties:
  • 0 Henk 'm!

  • Plecky
  • Registratie: Januari 2004
  • Niet online
@.oisyn Je mist een openingsaccolade voor de buitenste for-lus, maar daar zal de compiler ook wel iets van zeggen.

Acties:
  • 0 Henk 'm!

  • barber
  • Registratie: Oktober 2001
  • Niet online
ThomasB schreef op vrijdag 05 december 2008 @ 00:59:
...

Het probleem is nu dat na deze twee for-lussen, volgens de debugger het volgende geldt:
code:
1
2
3
4
parent->child[2]->playerLevel[0]
-842150451
parent->playerLevel[0]
0
(evenals de andere playerLevels)

...
Toch wel gek dat je de waarde -842150451 terug krijgt, dat is in hex 0xCDCDCDCD. De debug versie van de c runtime geeft elk stuk gealloceerd geheugen deze waarde mee. Dus er is nooit een waarde toegekend aan parent->child[2]->playerLevel[0] , maar als je dit op vraagt na die 2 for lussen dan zou die toch gevuld moeten zijn?

Acties:
  • 0 Henk 'm!

  • MLM
  • Registratie: Juli 2004
  • Laatst online: 12-03-2023

MLM

aka Zolo

barber schreef op vrijdag 05 december 2008 @ 03:37:
[...]

Toch wel gek dat je de waarde -842150451 terug krijgt, dat is in hex 0xCDCDCDCD. De debug versie van de c runtime geeft elk stuk gealloceerd geheugen deze waarde mee. Dus er is nooit een waarde toegekend aan parent->child\[2]->playerLevel\[0] , maar als je dit op vraagt na die 2 for lussen dan zou die toch gevuld moeten zijn?
Nou, nee dus :) Zie ook de comments van writser en .oisyn, de functie maakt 3x5 nodes die voor 1/5 gevuld zijn, terwijl het 3 nodes moeten zijn die voor 5/5 gevuld zijn :P Dus je hebt ongeinitialiseerd geheugen (namelijk, de missende 4/5)

-niks-

Pagina: 1