IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

où est le problème?


Sujet :

C

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 3
    Par défaut où est le problème?
    bonjour,
    je débute en C et pour cela j'ai créé ce code afin de maitriser la manipulation des pointeurs ET les listes chainées. Le code se compile sans erreurs et il affiche des résultats mais pas comme j'attendais. Dans le code je voulais afficher les mêmes informations de deux manières différentes: directement à partir du fichier données et à partir d'une liste (pile) que je la remplisse à partir de ce fichier. la première affichage est correcte mais la deuxième se fixe sur le dernier élément seul (j'ai remarqué que la longueur de la chaine a été bien modifiée mais pas le contenu des maillons!). Je vous laisse le code si quelqu'un aura la gentillesse de me montrer où ça cloche et merci par avance
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
     
    typedef struct t_liste 
    	{char *nom; char *prenom; char *courriel; struct t_liste *prec;}Maillon;
     
    Maillon *pMaillon=NULL;
    Maillon *pFirst=NULL;
    Maillon *pTempo=NULL;
     
     
    int main ()
    {
     
    int i=1;
    int n=0;
    int s;
     
    char Nom[32],Prenom[32],Courriel[32];
     
    FILE *pFichier=NULL;
     
    pFichier=fopen("groupes.txt","r");
    do
    {
    s=fscanf(pFichier,"%s%s%s",Nom,Prenom,Courriel);
    {
      printf("%d) %s  %s   %s\n",i++,Nom,Prenom,Courriel);}
     
     
     
    pTempo=(Maillon *)malloc(sizeof(Maillon));
     
     if(pTempo==NULL) exit(1);
     
     pTempo->nom=Nom; 
     pTempo->prenom=Prenom; 
     pTempo->courriel=Courriel; 
     
     pTempo->prec=pMaillon;
     
     
     
     
    pMaillon=pTempo;
     
     
     }
    while (s!=EOF);
     
     
    /*boucle d'affichage de la pile*/
    while(pMaillon)
         {
    	  n++;
    	printf("pile : %s  %s   %s \n",pMaillon->nom,pMaillon->prenom,pMaillon->courriel);
    	pMaillon=pMaillon->prec;
     
          }
     
     
    printf("longueur de la pile n=%d\n",n);
    free(pTempo);
    fclose(pFichier);
    return 0;
     
    }

  2. #2
    Membre émérite Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Par défaut
    • Pourquoi des globales ?
    • Toujours tester le retour de fopen() !
    • Inutile de caster le retour de malloc la conversion est faîtes de façon implicite .
    • Si le fscanf échoue tu fais quand même un tour de boucle,un while est donc plus approprié qu'un do while. ( il faut tester si fscanf à bien lu 3 mots )
    • A chaque tour de boucle tu écrases les valeurs de :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      char Nom[32],Prenom[32],Courriel[32];
      que tu affectes à tous les maillons ... Il faudrait allouer de la mémoire pour chaque chaîne et ceux pour chaque maillon, tu pourrais le faire de façon dynamique 'malloc' mais puisque tu as fixé une taille de 32 pourquoi ne pas faire simple et écrire :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
       
      typedef struct t_liste 
      {
      	char nom[32];
      	char prenom[32];
      	char courriel[32];
      	struct t_liste *prec;
      }Maillon;
      Bien évidemment cette fois les affectations se feront avec str[n]cpy(); par exemple.
    • Il faut boucler sur tes maillon et les libérer un à un .


    Bon courage.

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 3
    Par défaut
    Bonjour,
    désolé pour le retard

    j'ai lu tes remarques avec attention et j'ai rectifé mon code comme ceci:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
     
     
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
     
    typedef struct t_liste 
    	{char *nom; char *prenom; char *courriel; struct t_liste *prec;}Maillon;
     
    Maillon *pMaillon=NULL;
     
    Maillon *pTempo=NULL;
     
     
    int main ()
    {
     
    int i=1;
    int j=1;
     
     
    char Nom[32],Prenom[32],Courriel[32];
     
    FILE *pFichier=NULL;
     
    pFichier=fopen("groupes.txt","r");
     while(fscanf(pFichier,"%s%s%s",Nom,Prenom,Courriel)!=-1)
    {
     
     
      printf("%d) %s  %s   %s\n",i++,Nom,Prenom,Courriel);
     
    char *pNom, *pPrenom, *pCourriel;
     
     
    pTempo=(Maillon *)malloc(sizeof(Maillon));
    pNom=(char *)malloc(32*sizeof(char));
    pPrenom=(char *)malloc(32*sizeof(char));
    pCourriel=(char *)malloc(32*sizeof(char));
     
     
     
     if(pTempo==NULL) exit(1);
     if(pNom==NULL) exit(1);
     if(pPrenom==NULL) exit(1);
     if(pCourriel==NULL) exit(1);
     
     printf("Nom=%d\n",*Nom);
     strcpy(pNom,Nom);
     strcpy(pPrenom,Prenom);
     strcpy(pCourriel,Courriel);
     
     pTempo->nom=pNom;
     pTempo->prenom=pPrenom;
     pTempo->courriel=pCourriel;
     
     pTempo->prec=pMaillon;
     
     
     pMaillon=pTempo; 
     
     
     
     
     
     }
     
     
     
    /*boucle d'affichage de la pile*/
     
     
    pTempo=(Maillon *)malloc(sizeof(Maillon));
    pNom=(char *)malloc(32*sizeof(char));
    pPrenom=(char *)malloc(32*sizeof(char));
    pCourriel=(char *)malloc(32*sizeof(char));
     
     
     
     if(pTempo==NULL) exit(1);
     if(pNom==NULL) exit(1);
     if(pPrenom==NULL) exit(1);
     if(pCourriel==NULL) exit(1);
     
     *pNom="nom";
     *pPrenom="prenom";
     *pCourriel="mail";
     /* strcpy(pNom,Nom);
     strcpy(pPrenom,Prenom);
     strcpy(pCourriel,Courriel);*/
     
     pTempo->nom=pNom;
     pTempo->prenom=pPrenom;
     pTempo->courriel=pCourriel;
     
     pTempo->prec=pMaillon;
     
     
     pMaillon=pTempo; 
     
     
     
     
     
    while(pMaillon)
         {
     
    	  printf("%d) %s  %s   %s \n",j++,pMaillon->nom,pMaillon->prenom,pMaillon->courriel);
    	pMaillon=pMaillon->prec;
     
          }
     
     
     
     
    /*désallouer la mémoire et destruction de la pile*/
    while(pMaillon)
         {
           free(pMaillon);
    	pMaillon=pMaillon->prec;
    	printf("%p",pMaillon);
          }
    free(pTempo);
    fclose(pFichier);
    return 0;
     
    }
     
    malgré qu'il fonctionne je ne sais pas s'il est bien accepté comme code eficace sans faille ou pas (surtout coté libération de mémoire, ..)

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 392
    Par défaut
    Bonjour,
    • Tu utilises toujours des variables globales.
    • Tu castes toujours le retour de malloc().
    • Tu ne testes toujours pas le retour de fopen().

    Il est difficile de se retrouver dans ton code. Tu devrais le séparer en différentes fonctions...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre confirmé
    Inscrit en
    Mars 2006
    Messages
    117
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mars 2006
    Messages : 117
    Par défaut
    pour ameliorer la lisibilité du code, on decoupe les programmes en fonction, par exemple ici tu pourrai creer une fonction : ajout_maillon, suppression_maillon, affichage_list etc
    ca ameliorait bcp ton code.

    apres une chose tres moche dans ton code son ces variables globales. On utilise des globales uniquement lorsque c'est indispensable. Ici tu peux largement t'en passer.

    et enfin si tu veux tester les fuites de memoire, les erreurs d'addressage de pointeur etc, il existe des outils tres performant et simple pour cela.
    Si tu es sous Unix il existe un outil nommé Valgrind qui te permet de tester ton programme au niveau de l'utilisation memoire etc.

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 3
    Par défaut remerciements
    bonjour,

    c'est juste pour te dire que j'ai pas abondonné le sujet par choix et que j'ai bien profité de tes remarques et donc tous mes remerciements.

    Au fait je suis débordé puisque j'ai commencé des applications sur d'autres langages (java, sql,...).

    j'ai essayé aussi d'utiliser des debuguer (genre Valgrind, ...) pour mieux comprendre le déroulement en mémoire mais pas trop de scuccès, alors je suis obligé à patienter un peu avant de m'y retourner.
    encore merci.

Discussions similaires

  1. [AJAX] Quel est ce problème
    Par xcelent88 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 14/07/2007, 16h09
  2. Réponses: 3
    Dernier message: 25/10/2006, 09h39
  3. [MySQL] OU est le probléme avec ce code ??
    Par adlich dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 27/04/2006, 17h47
  4. rs.recordcount= -1 =>où est le problème?
    Par Fabby69 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 02/11/2004, 12h09
  5. Quel est le problème dans ce code ?
    Par Luther13 dans le forum C
    Réponses: 12
    Dernier message: 26/08/2003, 16h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo