2017-10-14 1 views
3

Construire un projet avec Visual Studio 2017 je suis tombé sur cette erreur:Visual Studio 2017 - Erreur MSB6006: "cl.exe" est sorti avec le code 2

error MSB6006: "CL.exe" exited with code 2.

voici mon code:

int main() 
{ 
    const int WIDTH=800; 
    const int HEIGHT=600; 

    Bitmap bitmap(WIDTH, HEIGHT); 

    unique_ptr<int[]> histogram(new int[Mandelbrot::MAX_ITERATIONS + 1]{ 0 }); 

    unique_ptr<int[]> fractal(new int[WIDTH*HEIGHT]{ 0 }); 
    //int fractal[WIDTH*HEIGHT]{ 0 }; 

    for (int y = 0; y < HEIGHT; y++) { 
     for (int x = 0; x < WIDTH; x++) { 
      double xFractal = (x - WIDTH/2 - 200)*2.0/HEIGHT; 
      double yFractal = (y - HEIGHT/2)*2.0/HEIGHT; 

      int iterations = Mandelbrot::getIterations(xFractal, yFractal); 
      if (iterations != Mandelbrot::MAX_ITERATIONS) { 
       histogram[iterations]++; 
      } 
      fractal[y*WIDTH + x] = iterations; 
      uint8_t color = 256 * (double)iterations/Mandelbrot::MAX_ITERATIONS; 
      color = color*color*color; 
      bitmap.setPixels(x, y, color, color, color); 
     } 
    } 

    bitmap.write("Mandelbrot.bmp"); 
    return 0; 
} 

le problème semble être la déclaration du tableau fractale:

unique_ptr<int[]> fractal(new int[WIDTH*HEIGHT]{ 0 }); 

si je commente que (et les autres lignes avec la variable fractale) le code compile très bien, et si je change le pointeur unique en un tableau int normal, le code compile mais il jette une exception quand je le débogue, signalant un débordement de pile.

La réduction de la taille du module résout le problème, il semble donc que le programme ne dispose pas de suffisamment d'espace mémoire pour fonctionner. J'ai beaucoup googlé et j'ai trouvé que visual studio limitait la taille de la pile à 1MB par deafult (je me trompe peut-être), mais je ne trouve pas comment l'augmenter manuellement dans visual studio 2017. Quelqu'un peut-il m'aider?

EDIT: voici la sortie complète:

1>------ Build started: Project: Fractal, Configuration: Debug Win32 ------

1>Main.cpp 1>INTERNAL COMPILER ERROR in 'C:\Program Files (x86)\Microsoft Visual

Studio\2017\Community\VC\Tools\MSVC\14.11.25503\bin\HostX86\x86\CL.exe'

1> Please choose the Technical Support command on the Visual C++ 1>

Help menu, or open the Technical Support help file for more

information 1>C:\Program Files (x86)\Microsoft Visual

Studio\2017\Community\Common7\IDE\VC\VCTargets\Microsoft.CppCommon.targets(360,5):

error MSB6006: "CL.exe" exited with code 2. 1>Done building project

"Fractal.vcxproj" -- FAILED.

========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

+0

Hors-sujet: Je suis confus pourquoi vous utilisez '' unique_ptr au lieu de 'std :: vector ' (ou 'std :: array' comme vos tailles peuvent être des constantes de temps de compilation) – UnholySheep

+2

La ligne de l'erreur que vous nous montrez est la moins informative. Copiez-collez le message d'erreur * full * et * complete * dans le corps de la question. –

+0

Edité avec le message d'erreur complet. Je suis toujours un débutant et je suis un cours, honnêtement j'ai utilisé des pointeurs uniques parce qu'ils ont été utilisés sur le parcours. J'ai juste essayé maintenant avec le vecteur et cela fonctionne, pendant que le tableau jette cette exception: "Exception non gérée à 0x01393089 dans Fractal.exe: 0xC00000FD: Dépassement de pile (paramètres: 0x00000000, 0x00482000). Je suis confus maintenant, pourquoi le vecteur fonctionnerait-il? –

Répondre

2

new int[N] { 0 } ne signifie pas « remplir le tableau avec des zéros », cela signifie en fait agrégat initialiser le tableau en définissant le premier élément à 0, et la valeur initialise le reste (qui définit le reste à 0). Par exemple, si vous avez écrit { 1 }, cela définirait le premier élément à 1 mais le reste serait toujours 0.

Puisque vous êtes déjà compter sur la valeur de l'initialisation, vous pourriez aussi bien retirer la 0 de {0}, qui fait d'ailleurs également votre code compilation:

std::unique_ptr<int[]> fractal(new int[WIDTH*HEIGHT] {}); 

Quant à savoir pourquoi votre code d'origine doesn 't compiler - c'est clairement un bug dans Visual Studio 2017. N'hésitez pas à report it.

est ici une application minimale de reproduire le problème:

int main() 
{ 
    auto test = new int[200000]{1}; 
    delete[] test; 
}