Dev c++ en rade sur les pointeurs ?...
Petit problème : un même programme bête de TP sur les pointeurs fonctionne à merveille compilé avec GCC sous une Debian mais produit un résultat horrible avec une compilation par Dev C++ via ming je ne sais quoi.
J'utilise juste les bibs : stdio.h et stdlib.h
Ya t-il à adapter quoi que ce soit, changer le nom d'une lib, en rajouter une pour rendre le programme correct sous windows ? Quelle est ma bêtise grossière que je connais pas ?
Voilà le listing complet en brut...
et merci pour votre aide bien sûr !
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111
|
#include<stdio.h> /* pour la declaration de NULL */
#include<stdlib.h>
struct cellule
{int nb;
struct cellule *suivant;
};
struct t_file
{
struct cellule *premier;
struct cellule *dernier;
};
void initialiser(struct t_file *f)
{
f->premier=NULL;
f->dernier=NULL;
}
void inserer(struct t_file *f , int valeur)
{
/* Cas premier element */
if ((f->premier == NULL) && (f->dernier == NULL) )
{
f->dernier=(struct cellule *) malloc (sizeof(struct cellule));
f->dernier->nb=valeur;
f->dernier->suivant=NULL;
f->premier=f->dernier;
}
else
{
f->dernier->suivant = (struct cellule *) malloc (sizeof(struct cellule));
f->dernier->suivant->nb = valeur;
f->dernier=f->dernier->suivant;
}
}
void afficher(struct t_file f)
{
struct cellule *temp;
temp = f.premier;
while (temp != NULL)
{
printf("%d \n", temp->nb);
temp=temp->suivant;
}
}
int compter(struct t_file f)
{
int compteur =0;
struct cellule *temp;
temp = f.premier;
while (temp != NULL)
{
compteur =compteur +1;
temp=temp->suivant;
}
return compteur;
}
void afficher_debut(struct t_file f)
{
if (f.premier != NULL)
{
printf("%d \n", f.premier->nb);
}
}
void afficher_fin(struct t_file f)
{
if (f.dernier != NULL)
{
printf("%d \n", f.dernier->nb);
}
}
void supprimer(struct t_file *f)
{
f->premier = f->premier->suivant;
}
int main (void)
{
struct t_file f;
initialiser (&f);
inserer (&f,3);
inserer(&f,5);
afficher(f);
afficher_debut(f);
afficher_fin(f);
supprimer(&f);
afficher(f);
printf("%d \n",compter(f));
return 0;
} |
Re: Dev c++ en rade sur les pointeurs ?...
Citation:
Envoyé par Magicien d'Oz
Code:
1 2 3 4 5 6
|
<...>
f->dernier=(struct cellule *) malloc (sizeof(struct cellule));
<...>
f->dernier->suivant = (struct cellule *) malloc (sizeof(struct cellule));
<...> |
Quand tu alloues de la mémoire pour tes structures, utilises calloc(). Ca initialisera les éléments de la structure à 0 ou NULL (selon le type). Malloc() ne le fait pas, ce qui fait que lors de l'affichage ta boucle while ne s'arrête jamais (pas de NULL final).
Re: Dev c++ en rade sur les pointeurs ?...
Citation:
Envoyé par Magicien d'Oz
Petit problème : un même programme bête de TP sur les pointeurs fonctionne à merveille compilé avec GCC sous une Debian mais produit un résultat horrible avec une compilation par Dev C++ via ming je ne sais quoi.
C'est sûremement de la faute du compilateur...
Citation:
J'utilise juste les bibs : stdio.h et stdlib.h
Eeek! Des fichiers d'entête (et il manque les <>). Les libs (bibliothèques) ce sont des .lib, .a etc. que tu ajoutes au projet.
Citation:
Ya t-il à adapter quoi que ce soit, changer le nom d'une lib, en rajouter une pour rendre le programme correct sous windows ? Quelle est ma bêtise grossière que je connais pas ?
Probablement un comportement indéfini...
La compilation a l'air correcte, mais j'ai une belle boucle infinie...
En fait, il manque un NULL au pointeur 'suivant' du nouvel élement. Pour éviter ce genre d'oubli, on sépare la création/initialisation de la structure et sa mise en liste :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| void inserer (struct t_file *f, int valeur)
{
/* -ed- creation de l'element */
struct cellule *new = malloc (sizeof *new);
if (new != NULL)
{
new->nb = valeur;
new->suivant = NULL;
/* -ed- gestion des liens */
/* Cas premier element */
if (f->premier == NULL && f->dernier == NULL)
{
f->premier = new;
f->dernier = f->premier;
}
else
{
f->dernier->suivant = new;
f->dernier = f->dernier->suivant;
}
}
} |
quand à la liberation, il faut veiller à ne pas couper la branche sur laquele on est assis...
Code:
1 2 3 4 5 6 7 8 9 10 11
|
void supprimer (struct t_file *f)
{
/* -ed- a liberer */
struct cellule *old =f->premier;
f->premier = f->premier->suivant;
/* -ed- liberation. */
free (old), old=NULL;
} |
Enfin, je ne fais pas de passe de structures par valeurs. J'utilise T*p ou T const *p selon les besoins.