[C]Pointeurs

Résolu/Fermé
Sauvegarde2 Messages postés 205 Date d'inscription dimanche 14 décembre 2008 Statut Membre Dernière intervention 11 janvier 2015 - 29 déc. 2011 à 19:55
Sauvegarde2 Messages postés 205 Date d'inscription dimanche 14 décembre 2008 Statut Membre Dernière intervention 11 janvier 2015 - 30 déc. 2011 à 00:33
Bonsoir,
Je dois rendre un projet sur les polynômes.

Ils sont définis comme suit (sur le modèle des listes chainées ) mais j'ai du mal à m'en servir correctement.

Par exemple j'ai écrit une fonction pour copier un polynôme (afin de le modifier ultérieurement) mais elle ne fonctionne pas correctement (le polynôme n'est pas copié jusqu'au bout et ne se termine pas par poly_zero) et je n'arrive pas à déterminer pourquoi.

Ça m'aiderais beaucoup si vous m'expliquiez ce qui ne va pas.
Merci d'avance.

---

#define poly_zero NULL
struct p_data {int coef; int deg; struct p_data *red;};
typedef struct p_data p_val;
typedef p_val* Poly;

Poly poly_copy(Poly p)
{
Poly s = poly_zero, q = poly_zero;
while(p != poly_zero)
{
s = malloc(sizeof(p_val));
if (q == poly_zero) q = s;
s->coef = p->coef;
s->deg = p->deg;
s = s->red;
p = p->red;
}
s = poly_zero;
return q;
}

4 réponses

Bonsoir

Je suis étonné que ça ne plante pas complètement.
Tu fais s = malloc(sizeof(p_val)); et quelques lignes plus loin s = s->red;
Mais je ne vois nulle part entre les deux l'initialisation de s->red, qui peut valoir absolument n'importe quoi.
1
Si j'ai bien compris ce que tu cherches à faire...
Quand tu recopies ton dernier coefficient, tu devrais mettre son champ red à NULL.
Or, tel que tu le fais, tu crées un coefficient supplémentaire, puis tu en perds la trace en mettant à NULL le pointeur qui te permettait de savoir où il était. Tu ne sauras jamais désallouer.
Poly poly_copy(Poly P)
{
  Poly p = P, S = malloc(sizeof(p_val)), s = S;
  while(p != poly_zero) {
    s->coef = p->coef;
    s->deg = p->deg;
    p = p->red;
    if (p != poly_zero) {
      s->red = malloc(sizeof(p_val));
      s = s->red;
    } else s->red = poly_zero;
  }
return S;
}
1
Sauvegarde2 Messages postés 205 Date d'inscription dimanche 14 décembre 2008 Statut Membre Dernière intervention 11 janvier 2015 261
Modifié par Sauvegarde2 le 29/12/2011 à 22:47
J'ai corrigé :
Avec la convention que les majuscule représentent les début de listes et les minuscule sont utilisées pour les parcourir.

Ce code s'arrête sur une erreur, il copie correctement mais ajoute un monôme bidon à la fin (qui justement vaut n'importe quoi).

Alors que pourtant le dernier élément du nouveau polynôme est bien mis sur NULL. et j'ai vérifié la boucle est parcourue le bon nombre de fin. Je n'y comprend rien.

En tout cas merci pour l'aide, je progresse un peu.

Poly poly_copy(Poly P)
{
Poly p = P, S = malloc(sizeof(p_val)), s = S;
while(p != poly_zero)
{
s->coef = p->coef;
s->deg = p->deg;
s->red = malloc(sizeof(p_val));
s = s->red;
p = p->red;
}
s = poly_zero;
return S;
}
0
Sauvegarde2 Messages postés 205 Date d'inscription dimanche 14 décembre 2008 Statut Membre Dernière intervention 11 janvier 2015 261
30 déc. 2011 à 00:33
Ah oui ça marche impeccable comme ça.
Merci du coup de main :)
0