Pb à l'exécution

Résolu
tomalille Messages postés 52 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 5 juin 2007 - 12 sept. 2005 à 06:00
tomalille Messages postés 52 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 5 juin 2007 - 12 sept. 2005 à 21:05
Bonjour,
J'ai un petit pb à l'execution de ce prog. Il compile et les liens sont fait sans erreur ni warning.
Par contre lorsque j'appelle le sous-programme "denombrement", l'ordi plante. Apparement, il fait bien le tab2 et le met dans 0 dans toutes les cases et ensuite il plante. Je ne comprend vraiment pas pourquoi, l'algorithme me semble bon en plus. Est-ce que la taille du tableau peut jouer: tab2 peut avoir 30000 cases?


Voici mon programme:


#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>


void denombrement(int* tab,int max);


void main(void)
{
//Initialisation des variables
int max =0;
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));


// int tab[8]={5,10,6,7,3,6,9,0};


//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]);

denombrement(tab,max);


free(tab);
}


void denombrement(int* tab,int max)
{
int i = 0;
int k = 0;
int lg = max;
int* tab1 = NULL; // Tableau de compte
//int* tab2 = NULL; // Tableau de résultats


//recherche de la valeur maximale du tableau
for(i=0;i<max;i++)
{
if(tab[i]>k)
k=tab[i];
}
//Construction du "tableau de compte"
tab1 = (int*)malloc(k*sizeof(int));
for(i=0;i<k;i++)
{
tab1[i]=0;
}
/*
for(i=0;i<max;i++)
{
tab1[tab[i]]=tab1[tab[i]]+1;
}

for(i=1;i<k;i++)
{
tab1[i]=tab1[i]+tab1[i-1];
}

//Construction du tableau de résultats
//tab2 = (int*)malloc(lg*sizeof(int));


for(i=0;i<lg;i++)
{
tab2[i]=0;
}


for(i=max;i=1;i--)
{
tab2[tab1[tab[i]]]=tab[i];
}
*/
//free(tab2);
free(tab1);
}

Une petite indication m'aiderait beaucoup. Merci d'avance!
tom

3 réponses

tomalille Messages postés 52 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 5 juin 2007
12 sept. 2005 à 21:05
j'ai trouvé mon erreur, c'était un problème d'indice.
Merci bcp
Thomas
3
cs_AlexMAN Messages postés 1536 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 24 mai 2009 1
12 sept. 2005 à 06:29
Vu l'heure qu'il est, ton code me semble bon a part un petit truc :

for(i=max;i=1;i--)
{
tab2[tab1[tab[i]]]=tab[i];
}

i = max va causer un 'petit' debordement de tampon, dans tab[], ptet ben dans tab1[] (si k <= max), et dans tab2[] assurément. Partir avec : for(i = max - 1; i >= 0; --i) {} peut peut etre arranger les choses. Mais attention, rien ne garantit que k sera > max, alors attention a comment tu penses ton prog...

+2(p - n)
0
tomalille Messages postés 52 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 5 juin 2007
12 sept. 2005 à 20:24
effectivement, ca pourrait poser problème, mais ce n'est pas le cas car souvent k=25000 voire 30000, les veleurs étant prises au hasard. Au niveau de l'algorithme, il est bon car je viens d'aller le vérifier à la bibliothèque...bizare!!
0
Rejoignez-nous