Suppression d'occurences dans un tableau

Signaler
Messages postés
6
Date d'inscription
vendredi 12 mars 2010
Statut
Membre
Dernière intervention
26 octobre 2011
-
Messages postés
6
Date d'inscription
vendredi 12 mars 2010
Statut
Membre
Dernière intervention
26 octobre 2011
-
Bonjour,

Y a t-il quelqu'un qui pourrait m'aider avec mon algorithme s'il vous plait? En effet, je souhaite effacer des occurences dans un tableau. A la compilation, pas d'erreurs mais à l'éxécution, erreur de segmentation.
Voici mon code :

void supprimeDoublonsTab(int* tab, int tailleTab){
int i, j;

for (i=0;i<tailleTab;i++){
for (j=tailleTab-1;j<tailleTab;j--){
if (tab[i] == tab[j]){
free(tab[j]);
tailleTab--;
realloc(tab, tailleTab);
}
}
}
}

Merci d'avance pour l'aide que vous pourries m'apporter :)
A voir également:

11 réponses

Messages postés
305
Date d'inscription
jeudi 29 avril 2004
Statut
Membre
Dernière intervention
18 janvier 2012

Salut.
}
}
}
}

S'il vous plait faites des efforts pour utiliser les balises code et décaler vos blocks {} pour que ce soit lisible.
Je ne me fatiguerai pas a lire ce code même s'il est court .
Messages postés
14807
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
16 septembre 2020
92
Hello,
for (j=tailleTab-1;j<tailleTab;j--){ 

Elle est là ton erreur: tu décrémentes j "tant qu'il est inférieur à tailleTab". Du coup, il va passer à -1...et crac!

Je plussoie LA_Tupac: les balises "code" sont là pour, justement, rendre le code plus lisible

@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Messages postés
6
Date d'inscription
vendredi 12 mars 2010
Statut
Membre
Dernière intervention
26 octobre 2011

désolé les gars, je suis nouveau sur le forum et je ne savais pas comment faire, milles excuses :S
voici donc mon code :
int* supprimeDoublonsTab(int* tab, int tailleTab){
int i, j;

for (i=0;i<tailleTab;i++){
for (j=tailleTab-1;j>tailleTab;j--){
if (tab[i] == tab[j]){
free(tab[j]);
tailleTab--;
realloc(tab, tailleTab);
}
}
}
return tab;
}


et du coup j'ai testé dans un main avec un tableau, et la réponse n'est pas ce que j'attendais.. :'(
mon code dans le main pour la déclaration de mon tableau et l'affichage de celui ci:
int* tab = (int*)malloc(sizeof(int)*6);
tab[0]=1;
tab[1]=1;
tab[2]=2;
tab[3]=3;
tab[4]=4;
tab[5]=2;

supprimeDoublonsTab(tab,6);
int i;
for (i = 0; i<=sizeof(tab);i++){
printf("%d\n", tab[i]);
}


help please :'(
Messages postés
6
Date d'inscription
vendredi 12 mars 2010
Statut
Membre
Dernière intervention
26 octobre 2011

et la réponse que j'obtiens sur la console :
1
1
2
3
4
Messages postés
14807
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
16 septembre 2020
92
free(tab[j]);

Tu penses faire quoi ici?
Littéralement, tu essaie de désallouer...un entier. Or, free demande un pointeur comme paramètre, donc plutôt tab+j

@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Messages postés
14807
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
16 septembre 2020
92
Et puis non, oublies. On ne désalloues pas "une case" comme cela.
Tu peux, par contre, décaler toutes les valeurs d'après.


@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Messages postés
6
Date d'inscription
vendredi 12 mars 2010
Statut
Membre
Dernière intervention
26 octobre 2011

mais avec le free, ça peut aussi marcher non? puisqu'il supprime bien mon dernier élément de mon tableau?
j'ai essayé de faire avec un décalage mais rien à faire les deux premiers 1 restent toujours :'(

voici mon code :
int* supprimeDoublonsTab(int* tab, int tailleTab){
int i, j;

for (i=0;i<tailleTab;i++){
for (j=tailleTab-1;j>tailleTab;j--){
if (tab[i] == tab[j]){
tab[j]=tab[j+1];
tailleTab--;
}
}
}
return tab;
}


:'( :'(
Messages postés
6
Date d'inscription
vendredi 12 mars 2010
Statut
Membre
Dernière intervention
26 octobre 2011

et le résultat dans la console reste inchangé :
1
1
2
3
4

Remarque qu'il avait bien effacé mon deuxième 2 qui se trouvait en fin de liste, que ce soit avec un free ou avec un décalage :)
Messages postés
14807
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
16 septembre 2020
92
Essaie de t'inspirer de ça
Et pour le décalage, regarde la méthode memmove()

@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Messages postés
305
Date d'inscription
jeudi 29 avril 2004
Statut
Membre
Dernière intervention
18 janvier 2012

désolé les gars, je suis nouveau sur le forum et je ne savais pas comment faire, milles excuses :S

Tu es tout excusé, c'est juste pour le principe, tu n'est pas le premier à faire ça
Messages postés
6
Date d'inscription
vendredi 12 mars 2010
Statut
Membre
Dernière intervention
26 octobre 2011

ok merci