2011-12-07 5 views
0

Je ne comprends pas pourquoi mon programme plante? quand je compile il le fait à la fin alors du programme cesse alors de répondre.Je ne comprends pas pourquoi cela bloque mon programme?

void rotate90(Image& image) 
{ 
    Pixel * tempPixel = new Pixel[(image.infoHeader.biWidth * image.infoHeader.biHeight)]; 
    for(int r = 0; r < image.infoHeader.biHeight; r ++) 
    { 
     for(int c = 0; c < image.infoHeader.biWidth; c++) 
     { 

      int f = c+(r*image.infoHeader.biWidth); 
      int t = (image.infoHeader.biHeight - r - 1) + (image.infoHeader.biWidth-c-1); 
      tempPixel[t] = image.pixels[f]; 
     } 
    } 
    image.pixels =tempPixel ; 
    delete[] tempPixel; 
} 
+1

Ce n'est pas la façon de modifier la question ... vous devez ajouter le des informations sur le nouveau problème que vous avez rencontré * après * l'ancien corps de la question, sinon les réponses actuelles deviennent apparemment sans rapport. –

Répondre

1

Vous devez déclarer cette variable avant de l'utiliser ...

Pixel * tempPixel = new Pixel[image.infoHeader.biWidth * image.infoHeader.biHeight]; 

Notez que vous devez désaffecter le tableau temporaire à la fin de la fonction avec delete[] (sinon vous avez une fuite de mémoire) . Pour rendre cela automatique et éviter les problèmes avec une sécurité d'exception, vous devez utiliser un pointeur intelligent, comme scoped_array<Pixel> de Boost ou (si vous avez un compilateur qui prend en charge le nouveau standard C++) unique_ptr<Pixel[]>.

Mieux encore: vous pouvez simplement utiliser un std::vector<Pixel>

std::vector<Pixel> tempPixel(image.infoHeader.biWidth * image.infoHeader.biHeight); 

et le laisser faire face à l'allocation/désallocation.


préemptif correction de réponse (en raison de votre new question): si à la fin vous allez attribuer tempPixel à image.pixels, vous ne devez pas delete[]tempPixel, sinon image sera remplacé par un pointeur vers la mémoire désallouée.

Mais vous avez des problèmes plus importants: lorsque vous remplacez image.pixels, vous ne libérez pas la mémoire vers laquelle il pointait précédemment. Donc, vous devez libérer que mémoire et puis lui affecter tempPixel. Tout cela en supposant que image.pixels a été alloué avec new et va être désalloué avec delete[] (sinon vous obtenez une discordance de fonctions d'allocation/opérateurs).


Par ailleurs, si votre image est juste une sorte d'emballage pour Windows DIB (BMP) comme il semble dans les champs en-tête les noms que vous ne prenez pas en compte le fait que les lignes de pixels sont 4 octets aligné (donc, si votre image n'est pas 32bpp, vous devez allouer plus de mémoire et effectuer la copie de pixel en conséquence).

+0

Merci beaucoup! – Jake

+1

@Jake. Si ma réponse a résolu votre problème, vous pouvez envisager de le marquer comme accepté. :) –

0

changement déclaration de tableau

tempPixel[] = new Pixel[(image.infoHeader.biWidth * image.infoHeader.biHeight)]; 

à

Pixel* tempPixel = new Pixel[(image.infoHeader.biWidth * image.infoHeader.biHeight)]; 

et rappelez-vous de le supprimer avec

delete[] tempPixel; 
Questions connexes