Suppression d'occurences dans un tableau

Messages postés
6
Date d'inscription
vendredi 12 mars 2010
Statut
Membre
Dernière intervention
26 octobre 2011
- - Dernière réponse : cs_ronnie10
Messages postés
6
Date d'inscription
vendredi 12 mars 2010
Statut
Membre
Dernière intervention
26 octobre 2011
- 26 oct. 2011 à 18:51
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 :)
Afficher la suite 

11 réponses

Messages postés
305
Date d'inscription
jeudi 29 avril 2004
Statut
Membre
Dernière intervention
18 janvier 2012
0
Merci
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 .
Commenter la réponse de cs_LA_Tupac
Messages postés
14681
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
5 décembre 2019
90
0
Merci
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...
Commenter la réponse de BunoCS
Messages postés
6
Date d'inscription
vendredi 12 mars 2010
Statut
Membre
Dernière intervention
26 octobre 2011
0
Merci
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 :'(
Commenter la réponse de cs_ronnie10
Messages postés
6
Date d'inscription
vendredi 12 mars 2010
Statut
Membre
Dernière intervention
26 octobre 2011
0
Merci
et la réponse que j'obtiens sur la console :
1
1
2
3
4
Commenter la réponse de cs_ronnie10
Messages postés
14681
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
5 décembre 2019
90
0
Merci
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...
Commenter la réponse de BunoCS
Messages postés
14681
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
5 décembre 2019
90
0
Merci
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...
Commenter la réponse de BunoCS
Messages postés
6
Date d'inscription
vendredi 12 mars 2010
Statut
Membre
Dernière intervention
26 octobre 2011
0
Merci
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;
}


:'( :'(
Commenter la réponse de cs_ronnie10
Messages postés
6
Date d'inscription
vendredi 12 mars 2010
Statut
Membre
Dernière intervention
26 octobre 2011
0
Merci
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 :)
Commenter la réponse de cs_ronnie10
Messages postés
14681
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
5 décembre 2019
90
0
Merci
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...
Commenter la réponse de BunoCS
Messages postés
305
Date d'inscription
jeudi 29 avril 2004
Statut
Membre
Dernière intervention
18 janvier 2012
0
Merci
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
Commenter la réponse de cs_LA_Tupac
Messages postés
6
Date d'inscription
vendredi 12 mars 2010
Statut
Membre
Dernière intervention
26 octobre 2011
0
Merci
ok merci
Commenter la réponse de cs_ronnie10