Bonjour,
je finalise un programme qui fonctionne parfaitement sauf que je ne peux pas travailler avec une liste de plus de 30 éléments pour le tri par base. Sinon Windows plante!!
Apparemment, le pb vient de cette petite partie de code:
do
{
buff=buff/div;
temp=temp+1;
div=div*10;
}while(buff!=0);
où je cherche sur combien de chiffre un nombre est représentée. Je trouve cela vraiment bizare!!
void main(void)
{
//Initialisation des variables
int max =5;
int i = 0;
int temp = 0;
int* tab = NULL;
printf("\n Entrer la longueur du tableau \n");
scanf("%d",&max);
tab = (int*)malloc(max*sizeof(int));
//valeur au hasard
srand( (unsigned)time( NULL ));
for( i = 0;i < max;i++ )
tab[i]=rand();
//Présentation du tableau
printf("\n **** Tableau de depart **** \n");
for(i=0;i<max;i++)
printf("%d \n",tab[i]);
//Résultat final
printf("\n **** Tableau final **** \n");
for(i=0;i<max;i++)
printf("%d \n",tab[i]);
printf("\n");
}
int* denombrement(int* tab,int c,int max)
{
int i = 0;
int k = 9;
int lg = max;
int div = 1;
int* tab1 = NULL; // Tableau de compte
int* tab2 = NULL; // Tableau de résultats
int* inter = NULL; //tableau de travail
//construction du div
for(i=1;i<=c;i++)
{
div=div*10;
}
//construction du tableau de travail
inter = (int*)malloc((max)*sizeof(int));
for(i=0;i<max;i++)
{
inter[i]=tab[i]%div/(div/10);
}
//Construction du "tableau de compte"
tab1 = (int*)malloc((k+1)*sizeof(int));
for(i=0;i<=k;i++)
{
tab1[i]=0;
//Tri par base
void base(int* tab,int max)
{
int i=0;
int j=0;
int temp=0;
int buff = 0;
int div=1;
int c=1; //Nombre de chiffres max de représentation des valeurs à tester
for(i=0;i<max;i++)
{
buff=tab[i];
temp=0;
do
{
buff=buff/div;
temp=temp+1;
div=div*10;
}while(buff!=0);
if(temp+1>c)
c=temp+1;
temp=0;
}
//Algorithme de tri
for(i=1;i<=c;i++)
{
tab=denombrement(tab,i,max);
}
il faut réinitialiser div avant chaque boucle sinon, tu fait des multiplications par 10 indéfiniement. Mais comme les int ont une borne max, il y a overflow et tu repart modulo la borne max => à un momment, tu tombe sur 0 et boom division par 0 ça plante.
for(i=0;i<max;i++)
{
buff=tab[i];
temp=0;
div = 1;
do
{
buff=buff/div;
temp=temp+1;
div=div*10;
}while(buff!=0);
if(temp+1>c)
c=temp+1;
temp=0;
}