J'ai un problem de compilation

Fermé
malek2212 Messages postés 18 Date d'inscription samedi 19 juillet 2014 Statut Membre Dernière intervention 22 janvier 2018 - 8 nov. 2014 à 14:06
sambia39 Messages postés 610 Date d'inscription vendredi 31 juillet 2009 Statut Membre Dernière intervention 9 février 2023 - 9 nov. 2014 à 14:32
Bonjour,

lors qaund je vais compilier un program qui eclater une liste chainee en deux liste l'une contient les element pairs et l'autre contient les element impair

mon pc il devenu tres lent et je peux pas faire rien
je veut savoir pourqoui
voila c'est mon program je veux vous aidez
#include <iostream>
#include <stdio.h>
#include <stdlib.h>






struct elm
{int val;
struct elm * suiv;
};
typedef struct elm *liste;
liste l,l1,l2,p;

/////////////////////////////////////////////////creation/////////////////////////////////////////////////////////////////
void creation(liste * l)
{int x,n,i;


printf("entrez le nombre d'elm de votre liste\n");
scanf("%d",&n);

for (i=1;i<=n;i++)
{printf("entrez la valeur de elm %d\n",i);
scanf("%d",&x);
p=new(elm);
p->val=x;
p->suiv=*l;
*l=p;
}


}
///////////////////////////////affichege///////////////////////////////
void affichage (liste l)
{liste p;
p=l;
while(p!=NULL)
{printf("%d\n",p->val);
p=p->suiv;
}
}

void eclater(liste l,liste *l1,liste *l2)
{
liste p;
while(l!=NULL)
{if(l->val %2== 0)

{
p=new(elm);
p->val=l->val;
p->suiv=*l1;
*l1=p;

}else
{p=new(elm);
p->val=l->val;
p->suiv=*l2;
*l2=p;

}
}l=l->suiv;
}


main()
{



creation(&l);
eclater(l,&l1,&l2);
affichage(l1);
affichage(l2);
}

1 réponse

ElementW Messages postés 4814 Date d'inscription dimanche 12 juin 2011 Statut Contributeur Dernière intervention 5 octobre 2021 1 228
8 nov. 2014 à 16:42
'lut, "mon pc il devenu tres lent et je peux pas faire rien", normal, tu as une allocation mémoire qui s'exécute en boucle quelque part (j'ai testé, le graphique RAM monte en flèche; heureusement Linux roxxe du poney et l'OOM Killer s'est chargé de le tuer a ma place :-° )

Au fait, l'indentation, ça te dit quelque chose? Décalage du code selon les niveaux d'accolades... tu verras c'est très pratique.

p->suiv=*l;
, non!
p->suiv
est du type
struct elm *
, et tu lui attribues le contenu la structure pointée par
l
?!
*l=p;
, non de non;
l
est un pointeur d'
elm
, et tu le déréférences pour l'attribution à p qui est aussi un pointeur; je sais pas comment l'expliquer facilement, mais ça revient à faire
l[0] = p;
, or
l
n'est pas un tableau, ni même alloué lors de la première itération de demande de valeur (potentiel crash donc, vu que cette variable n'est pas initialisée).

En fait ces deux lignes font les choses a l'envers; il faut que p contienne la structure que tu as créé avec
new
(ce qui est le cas), que tu attribues
p->val
(c'est fait), que tu laisses
p->suiv
vide (NULL) ou non initialisé
(car on a pas encore créé l'élément suivant), attribues
p
(qui est un pointeur) à
l->suiv
(car l est l'élément précédent), puis enfin attribues le pointeur
p
au pointeur
l
.
Sachant que dans tout ça il faut que premier
elm
alloué soit 1. conservé (c'est le début de la chaine), 2. pas attribué à
l->suiv
car
l
n'est pas encore attribué.

Et idem pour ta fonction
eclater
, qui est celle qui cause problème au niveau de la mémoire...
0
sambia39 Messages postés 610 Date d'inscription vendredi 31 juillet 2009 Statut Membre Dernière intervention 9 février 2023 49
9 nov. 2014 à 14:32
Bonjour
perso, j'ai décrocher dé le départ
à bientôt
0