liste simplement chainé==> pb [résolu==> merci] [c] - C - Programmation
Marsh Posté le 16-03-2007 à 22:42:33
pour modifier un pointeur, il est de bon aloi d'utiliser un pointeur de pointeur
Ta fonction ajouteDebut ne modifie en rien ta liste dans ton main
Marsh Posté le 16-03-2007 à 22:48:25
Un pointeur de pointeur ? c'est quoi cet animal ?
Dois-je ecrire :
void ajouteDebut(liste **l,int b)
?
Marsh Posté le 16-03-2007 à 23:08:00
Je te signale aussi que ta fonction ajouteFin ne fonctionne pas non plus. (en plus de ne pas initialiser a->next à NULL).
Il faut tester le retour des malloc et enfin, en C, on ne caste pas les malloc.
Marsh Posté le 16-03-2007 à 23:14:50
Trap D a écrit : Je te signale aussi que ta fonction ajouteFin ne fonctionne pas non plus. (en plus de ne pas initialiser a->next à NULL). |
Effectivement, mais c'est juste un couper coller malheureux
Trap D a écrit :
|
C'est à dire?
le castage ( heu... ça existe ?) des malloc vient aussi d'un oubli de modif du code pour repassage de c++ en c parcque pour une raison que j'ignore, un printf("%d", (l->next)->next) me donne une erreur de segmentation, mais pas un cout << (l->next)->x, sur les compilateur de mon ecole.
Marsh Posté le 16-03-2007 à 23:54:01
Tu peux fort bien ne plus avoir de mémoire à ta disposition, aussi l'alllocation mémoire peut échouer et la fonction malloc te renvoie NULL. Donc, il faut tester le retour.
Marsh Posté le 17-03-2007 à 12:35:04
castorgris a écrit : Un pointeur de pointeur ? c'est quoi cet animal ? |
http://mapage.noos.fr/emdel/notes. [...] e_variable
Marsh Posté le 17-03-2007 à 22:32:11
castorgris a écrit : Bonjour,
|
Très gros problème de conception dans ce code
1) dans le main, tu fais "l=malloc()" => ok
2) ensuite, tu fais "ajouteDebut(l, 4) et dans la fonction "ajouteDebut", tu cherches à faire "a=malloc()" puis "l=a" => donc tu remplaces le résultat de ton malloc initial par le second malloc => t'as perdu ton pointeur initial !!!
Accessoirement, comme l'a dit Joel F, pour modifier une variable dans une fonction, il faut passer l'adresse de cette variable à la fonction qui la stocke dans un pointeur sur cette variable. Donc si tu veux modifier "l" qui est de type "liste *", tu dois passer "&l" à ta fonction qui la stockera dans un "liste **". Ensuite, dans ta fonction "ajouteDebut()", chaque fois que tu veux t'adresser à ton pointeur, tu dois utiliser "*l". Mais de toute façon, même si tu écris correctement ta fonction d'un point de vue syntaxique, tu planteras ton programme car tu perdras ton malloc initial.
Question: Pourquoi faire plein de malloc ? Pourquoi ne pas adopter un comportement "objet" qui serait "j'écris une fonction qui alloue de la mémoire et me remplis mon élément avec ma valeur et qui me renvoie l'adresse allouée" puis faire "j'appelle cette fonction quand j'ne ai besoin et j'insère l'élément alloué là où il faut"
Par exemple un truc de ce style
Code :
|
C'est déjà un bon début. Ensuite, je ferais une différenciation entre "type élément" et "type liste" en créant des conteneurs spécialisés pour chacun. Ainsi, je pourrais manipuler plus facilement la liste en elle-même et/ou chaque élément qui la compose. Et je pourrais agrémenter la liste d'autres trucs utiles comme par exemple "nb d'éléments" ou "premier et dernier" ou autres outils...
Marsh Posté le 18-03-2007 à 18:21:09
Merci de passer du temps sur ça.
Ce petit bout de code est un exercie pour nous apprendre à manipuler des pointeurs.
Après moult tentative, j'en suis arrivé à
Code :
|
qui marche sans pb.Maiis j'ai changais d'approche par rapport à ce que j'avais ecrit au début.
Par contre je ne gère pas la liberation mémoire de tmp.
Merci pour ta solution sve@r, qui me semble bien plus "propre" et moins maladroite .
Il faut que j'apprenne à utiliser l'approche objet du langage, parceque moi j'ai tendance à ecrire du code parfois fonctionnel ( souvent non ...) en barbare, surtout que l'usage que j'ai ( et que j'aurais) est un usage "calcul".Je ne coderais jamais une application, mais des fonctions d'integration numérique si .
Merci pour l'aide.
je repasserais surement bientôt pour un autre problème ....
Marsh Posté le 18-03-2007 à 23:18:36
castorgris a écrit : |
Le mot que tu cherche, c'est pas plutôt "impérative" ?
http://fr.wikipedia.org/wiki/Progr [...] ctionnelle
http://fr.wikipedia.org/wiki/Progr [...] 3%A9rative
Marsh Posté le 18-03-2007 à 23:32:23
castorgris a écrit : Il faut que j'apprenne à utiliser l'approche objet du langage |
http://mapage.noos.fr/emdel/tad.htm
Marsh Posté le 19-03-2007 à 07:24:21
Joel F a écrit : Le mot que tu cherche, c'est pas plutôt "impérative" ? |
Par fonctionnel je voulais dire "qui marche"...
Marsh Posté le 19-03-2007 à 07:24:54
Merci.Dès que j'ai un moment de libre j'irais voir.
Marsh Posté le 19-03-2007 à 16:17:30
castorgris a écrit : Merci de passer du temps sur ça.
|
Ca marche sans problème à condition que, dans la fonction appelante, tu imposes que ta liste récupère ce que renvoie ta fonction "ajouteDebut" sinon ton début ne changera pas. C'est un défaut de conception car ta fonction qui est sensée ajouter un élément au début de la liste ne le fait en fait pas. C'est ta façon de récupérer ce qu'elle renvoie qui fera que ça marche ou pas...
Je vais te donner un début de code. Essaye de le comprendre pour le compléter ensuite avec les fonctions qui t'intéressent...
typedef struct elem { |
Marsh Posté le 16-03-2007 à 22:37:27
Bonjour,
J'ai un problème avec ceci :
Il ne s'agit que de la manipulation de liste chainé.Le problème ce situe au niveau de l'ajout en début de liste.La procédure ne marche pas ( erreur de segmentation à l'execution) mais je ne comprend pas pourquoi.
Je pense avoir identifié le pb ( au niveau de l'affectation l=a), mais je ne comprend pas pourquoi ça foire.
Si quelqu'un avait la gentillesse de m'aider ....
Pour info, compilé avec gcc 4.1.2 sous ubuntu edgy eft.
Merci d'avance
Message édité par castorgris le 18-03-2007 à 18:21:50