2012-06-14 3 views
1

J'ai la méthode suivante:C données ++ changement sans raison apparente

void Polygon::expand() { 
    int newSize = max * 2; 
    printArray(array, current); 
    Point* newArray = new Point[newSize]; 
    printArray(array, current); 
    for (int i = 0; i <= current; i++) { 
      newArray[i] = array[i]; 
    } 
    delete[] this->array; 
    array = newArray; 
    max = newSize; 
} 

printArray est pour le débogage et est également très simple:

void printArray(Point* array, int size) { 
    cout << "array\n==========" << endl; 
    for (int i=0; i<=size; i++) { 
      cout << array[i] << ": " << array[i].getX() << ", " << array[i].getY() << endl; 
    } 
} 

La méthode tente de développer ensemble, ce qui est un membre de classe de type Point*. La chose étrange est l'impression que je reçois lors de l'exécution suivante:

tableau
==========
(0,0): 0, 0
(1,1): 1, 1
(2,2): 2, 2
(3,3): 3, 3

tableau ==========
(0,0): 0, 0
(1,1): 1, 1
(2,2): 2, 2
(3,5.58294e-322): 3, 5.58294e-322

Pour une raison quelconque la dernière Point des changements de tableau, même si je ne l'ai pas touché entre les impressions! Une idée sur ce qui peut causer cela?

Répondre

7

Lorsque vous démarrez votre indexation à partir de 0 (comme en C et C++) vous vous arrêtez à un moins que le size. Alors, faites:

for (int i=0; i<size; i++) // not <= 

Ceci est un hors par un classique erreur (et vous appeler UB).

+0

Je ne vois pas comment cela peut être ce qui provoque l'impression de différents points, même si je suis parti par un. –

+0

Lorsque vous appelez UB, comme vous l'avez fait plus d'une fois, vous ne pouvez vous attendre à aucune sortie saine. Fixez votre code et donnez-lui un autre coup de feu. Rappelez-vous que nous ne savons même pas ce que 'getX',' getY' fait. Donc, je vous suggère de vérifier eux aussi. – dirkgently

+0

Dans ce cas, 'current' est conservé comme le plus grand index, pas la taille réelle. –

Questions connexes