[C]Pointeurs
Résolu
Sauvegarde2
Messages postés
205
Date d'inscription
Statut
Membre
Dernière intervention
-
Sauvegarde2 Messages postés 205 Date d'inscription Statut Membre Dernière intervention -
Sauvegarde2 Messages postés 205 Date d'inscription Statut Membre Dernière intervention -
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;
}
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.
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.
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.
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; }
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;
}
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;
}