pgl10
Messages postés366Date d'inscriptionsamedi 18 décembre 2004StatutMembreDernière intervention17 mai 2023
-
Modifié par pgl10 le 17/01/2015 à 22:50
pgl10
Messages postés366Date d'inscriptionsamedi 18 décembre 2004StatutMembreDernière intervention17 mai 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 !
--
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
pgl10
Messages postés366Date d'inscriptionsamedi 18 décembre 2004StatutMembreDernière intervention17 mai 20239 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.
--