Voici un cas bizarre de compilation C++ [Résolu]

pgl10 296 Messages postés samedi 18 décembre 2004Date d'inscription 14 avril 2018 Dernière intervention - 17 janv. 2015 à 21:41 - Dernière réponse : pgl10 296 Messages postés samedi 18 décembre 2004Date d'inscription 14 avril 2018 Dernière intervention
- 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 !
--
Afficher la suite 

2 réponses

Répondre au sujet
cptpingu 3784 Messages postés dimanche 12 décembre 2004Date d'inscriptionModérateurStatut 18 avril 2018 Dernière intervention - Modifié par cptpingu le 18/01/2015 à 14:23
0
Utile
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
Commenter la réponse de cptpingu
pgl10 296 Messages postés samedi 18 décembre 2004Date d'inscription 14 avril 2018 Dernière intervention - 18 janv. 2015 à 15:51
0
Utile
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.
--
Commenter la réponse de pgl10

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.