Voici un cas bizarre de compilation C++

Résolu
pgl10 Messages postés 380 Date d'inscription samedi 18 décembre 2004 Statut Membre Dernière intervention 29 octobre 2023 - Modifié par pgl10 le 17/01/2015 à 22:50
pgl10 Messages postés 380 Date d'inscription samedi 18 décembre 2004 Statut Membre Dernière intervention 29 octobre 2023 - 18 janv. 2015 à 15:51
Bonjour,

Voici un cas très bizarre.
Le programme ci-après fonctionne parfaitement, ou du moins semble fonctionner très bien, comme attendu.
Il est compilé avec Visual Studio 2012 Express for Windows Desktop en français.
C'est un programme en mode console, en Release et mode Win32.


#include <iostream>

int main () { 
    // initialisation des premiers et primorielles 
    int premier [22] = {1,2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71};
    int m_premier = 10;  
    int mod = 30;
    int crible [500];
    // variables auxiliaires  
    int i, j;
    int nombre, un_nb, residu, m, n;
    // Calcul des Primorielles, initialisation du "crible"
    std::cout << "primorielles :\n";
    int primorielle [22]; 
    primorielle[0] = 1;
    for (i=1; i < m_premier; i++) { 
        primorielle [i] = primorielle [i-1] * premier [i];
    }
    for (i=0; i < m_premier; i++) { 
        crible [i] = premier [i];
        std::cout << i << " \t" << premier [i] << " \t" << primorielle [i] << std::endl; 
    }
    // entrée du nombre à l'écran
    for(;;) {
        std::cout << "entrez un nombre, 0 arr\210t : " ;
        std::cin >> un_nb;
        if (un_nb <= 0) return 0;
        nombre = un_nb;
        if (nombre > primorielle [m_premier-1]) { 
            std::cout << "Erreur nombre trop grand \n" ; 
            continue;
        } 
        // vecteur des coefficients du nombre en primorielles x1.P1# + x2.P2# + ... + xn.pn# 
        int p_nombre [22];
        // décomposition du nombre en somme de primorielles 
        // Remise à Zero du vecteur des coefficients de primorielles
        for (i =0; i<m_premier; i++) p_nombre [i]= 0;
        // Recherche des coefficients des primorielles 
        residu = nombre;
        j=m_premier-1;
        // recherche de la plus petite primorielle > nombre puis décomposition 
        while (nombre < primorielle[j]) j= j-1; 
        for (i=j; i>=0; i--) {
            n = residu / primorielle [i];
            p_nombre [i] = n;
            m = residu - n * primorielle [i];
            residu = m;
        }
        // imprimer le nombre exprimé en coefficients de primorielles
        std::cout << "nombre :  " << nombre << std::endl;
        std::cout << "vect :  " << std::endl;
        for (i=0; i<j+1; i++) std::cout << p_nombre[i] << " " << std::endl;
        int somme = 0;
        for (i=0; i<j+1; i++) somme = somme + p_nombre[i] * primorielle[i];
        std::cout << "somme :  " << somme << std::endl;
        // initialiser les produits de 2 restes de premiers  
        // développement des produits des résidus du crible candidats 
        int produit [100] [100] [2];
        for (i=1; i<m_premier; i++)
            for (j=i; j<m_premier; j++) {
                m = crible [i] * crible [j];
                produit [i] [j] [0] = m % mod;
                produit [i] [j] [1] = m / mod;
                // Impression de l'énumération des produits décomposés en quotien et modulo   
                std::cout << premier[i] <<"\t"<< premier[j] << "\t" << m << "\t"
                          << produit [i] [j] [0] << "\t"<< produit [i] [j] [1] << std::endl; 
            }
    }
    return 0;
}

Le problème est le suivant.
Si on change uniquement l'instruction : int produit [100] [100] [2];
en : int produit [1000] [1000] [2];
La compilation est sans erreur et sans warning, mais l'exécution plante sans aucun résultat affiché !
Et en mode Debug, c'est pareil : plantage immédiat à l'exécution sans aucune explication.
Il doit bien y avoir une raison ... ( ? ) C'est quand même assez intrigant !
--

2 réponses

cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
Modifié par cptpingu le 18/01/2015 à 14:23
Bonjour.

Quand tu déclares un tableau statique, celui-ci est mis sur la "stack" qui a une petite taille par défaut. Quand tu alloues de la mémoire, il est mis sur le "heap" qui n'est limité que par la RAM physique disponible.
Donc déclarer un "gros" tableau "static" peut tout à fait planter à l'exécution. La solution pour déclarer des tableaux de grandes tailles est plutôt de les mettre sur le "heap".
Pour du tableau à 3 dimensions "static" de grande taille (dans le sens: on ne veut pas en changer les dimensions), j'utilise cette classe: https://github.com/cptpingu/game/blob/master/src/Core/Array3D.hh

__________________________________________________________________________________________________

Améliorez votre expérience CodeS-SourceS avec ce plugin:
http://codes-sources.commentcamarche.net/forum/affich-10000111-plugin-better-cs-2#cptpingu-signature
0
pgl10 Messages postés 380 Date d'inscription samedi 18 décembre 2004 Statut Membre Dernière intervention 29 octobre 2023 11
18 janv. 2015 à 15:51
Bonjour CptPingu,

Merci beaucoup pour cette très bonne explication. J'aurais dû penser à cet aspect du problème, mais je me suis obnubilé à essayer vainement d'avoir des messages intermédiaires pour trouver l'endroit du crash et bien sûr aucun de mes messages intermédiaires n'étaient affichés. Il est quand même dommage qu'en mode Debug je n'ai eu aucun renseignement non plus.
Tous mes remerciements non seulement pour l'explication mais aussi pour le moyen d'éviter ce problème.
--
0
Rejoignez-nous