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 :

une fonction supprime qui ne marche pas!


Sujet :

C

  1. #1
    Membre du Club
    Inscrit en
    Décembre 2009
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 128
    Points : 51
    Points
    51
    Par défaut une fonction supprime qui ne marche pas!
    salut
    je voulais rebouler un programme ,mais ceci ne marche pas.
    le principe est simple:on prends un booléen que l'on initialise à 0 et des que l'utisateur tappe la lettre O ou o ,la variable recoie 1 ,avec biensûr un do..while :
    voici une partie de mon code source :
    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
    struct information_operation
      {
           char nom_operation[20];
           int num_operation;
            char date[12];
           char id_lecteur[50];
           char id_code_livre[50];
      };
     
    typedef struct operation 
      {
           struct information_operation inf_op;  //c une structure comprotant les informations .
           struct operation *suivant;
      }maillon;
    typedef maillon* liste;
    et voila la fct supprime
    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
    liste suppresssion(liste l)
       {
          liste tmp=l,avantTmp=l;
          int numAsuprimmer;
                printf(\"taper le numéros de l\'operation à supprimer:\");
                scanf(\"%d\",&numAsuprimmer);
          if (l==NULL)
              {
                printf(\"Attention ! il n\'y a aucune opération à supprimer \");
                getch();
                return NULL;
              }  
                     if (l->suivant==NULL)
              {
               free(l);
               return NULL;
              }  
          else 
              {
                      while ((tmp!=NULL)&&(tmp->inf_op.num_operation!=numAsuprimmer))
                                 {
                                  avantTmp=tmp;
                                  tmp=tmp->suivant ;
                                  }
                            if(tmp->suivant==NULL )
                                  {
                                  printf(\"le numéro de l\'opération n\' exite pas !\");
                                  return NULL;
                                  }
                            else 
                                  {
                                  avantTmp->suivant=tmp->suivant;
                                 free(tmp);
                                  }
                 }
               return l;
     
    }
    le problème que lorsque je exécute le programme et je supprime une opération ,je revient pour afficher la liste je trouve que au lieu de l 'opération j 'ai des caractères spéciaux .

    merci de m 'aidez à trouver le problème !

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    d'abord, pourquoi cacher un pointeur dans un type ??

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef maillon* liste;
    très très très déconseillé....


    Ensuite, parle un peu le français stp :

    salut les zeros
    je voulais rebouler un programme ,mais ceci ne marche pas.
    le principe est simple:on prends un bollene que l'on initialise à 0
    ...
    le problème que lorsque je exécute le
    On ne comprend rien....

  3. #3
    Membre du Club
    Inscrit en
    Décembre 2009
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 128
    Points : 51
    Points
    51
    Par défaut
    je suis désolé pour les erreurs
    typedef maillon* liste;
    très très très déconseillé....
    pourquoi ,j'avais toujours l'habitude de le faire surtout lorsque je travail sur les listes simplement chainées !

  4. #4
    Membre éclairé
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Points : 842
    Points
    842
    Par défaut
    Comme l'a dit souviron34, ça masque un pointeur !
    Si tu vois mallion* tu sais tout de suite qu'il s'agit d'un pointeur, si tu vois liste tu ne sais pas.

    Tu as des soucis dans ton programme. Ex. (entre autres) :

    Edit: Suppression d'une coquille.

  5. #5
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    une autre chose serait de séparer la saisie de la fonction..

    Supression supprime de la liste..

    Elle devrait avoir en paramètre la liste ET le numéro du maillon à supprimer..

    Les saisies devrait se faire dans un menu à part..

  6. #6
    Membre du Club
    Inscrit en
    Décembre 2009
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 128
    Points : 51
    Points
    51
    Par défaut
    salut ,je m'execuse de cette réponse qui vient en retard
    pouet_forever=>oui je devais écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while ((tmp!=NULL) ...
    [...]
    if(tmp==NULL )
    c'est ça ,nn?
    je pense qu'il y a pas de problème lorsqu'on mélange la saisie avec le numéro de l'opération à supprimer !
    mais malgré tout le code ne marche pas !!

  7. #7
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Points : 1 750
    Points
    1 750
    Par défaut
    Je ne comprends pas pourquoi tu échappes tous tes guillemets dans les printf. Ca arrive à compiler, ça ?!

  8. #8
    Membre éclairé
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Points : 842
    Points
    842
    Par défaut
    J'ai dit une bêtise plus haut, je m'excuse
    Ton code ne fonctionne pas parce que, comme l'a dit jeroman, tu échappes tous tes guillemets même en dehors des chaînes de caractères

  9. #9
    Membre du Club
    Inscrit en
    Décembre 2009
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 128
    Points : 51
    Points
    51
    Par défaut
    salut
    non svp c'est slach sont des ereurs lors de l'écriture de la discussion ca n'a rien avoir avec le code que j'ai sous le DEV
    je m'excuse

  10. #10
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Points : 1 750
    Points
    1 750
    Par défaut
    Poste un code compilable. Ca va être difficile de t'aider sinon.

  11. #11
    Membre éclairé
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Points : 842
    Points
    842
    Par défaut
    Je viens de relire ton code, et finalement ce que j'avais dit plus haut est correct
    Tu fais ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    while ((tmp!=NULL)
    [...]
    if(tmp->suivant==NULL)
    Si après ton while tmp vaut NULL, accéder à tmp->suivant causera un segfault.

  12. #12
    Membre du Club
    Inscrit en
    Décembre 2009
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 128
    Points : 51
    Points
    51
    Par défaut
    pouet_forever=>c'est corréct ,j'ai rectifier le code ,mais malegré cela le code ne marche pas !!!

  13. #13
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 121
    Points : 136
    Points
    136
    Par défaut
    Bonsoir hindou90

    Après ta boucle while corrige ton test pour savoir si ton opération a été trouvée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    /*if (tmp->suivant==NULL )*/
    if (tmp==NULL) 
         {
         printf("le numéro de l\'opération n\' exite pas !");
         return NULL;
         }
    Sinon, lorsque ta boucle ne retrouve pas ton numéro d'opération ton pointeur tmp->suivant va attérir dans les choux.

  14. #14
    Membre du Club
    Inscrit en
    Décembre 2009
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 128
    Points : 51
    Points
    51
    Par défaut
    bonsoir rebel64,
    j'ai modifié le test et la boule mais le code ne marche pas !!!!

  15. #15
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Points : 1 750
    Points
    1 750
    Par défaut
    Voir message #10.

  16. #16
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 121
    Points : 136
    Points
    136
    Par défaut
    Dans ta fonction de suppression, si tu retires la première opération de la liste tu dois ajuster l sur le suivant avant de retourner sa valeure, sinon tu vas retourner un pointeur vers une opération fantôme...

    Tu n'as pas de debugger qui te permettrais de suivre l'exécution de ton programme pas à pas et de mettre le doigt sur ton problème ?
    A ce stade çà serais pas mal.

    A défaut passe nous un peu plus de code source (la génération de ta liste et son impression par exemple).

  17. #17
    Membre du Club
    Inscrit en
    Décembre 2009
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 128
    Points : 51
    Points
    51
    Par défaut
    salut
    je suis vraiment très désolé de cette réponse qui vient en retard
    j'ai pris ce qui vous avez dit en considération ,amis le code ne fonctionne pas correctement parmi les problèmes qui se génèrent lors de l'exécution:
    1.si je supprime la 1 opération ,et j'affiche la liste ,je constate que au lieu de la 1 opération ,j'ai des caractére spéciaux !!!
    2.si je tape un numéro d'opération qui n'existe pas ,le compilateur il le considère comme si il existe !!!!(et dans ce cas il supprime la dernière opération )
    voila le code de la fct supprime :
    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
    *liste suppresssion(liste l)
       {
     
          int numAsuprimmer;
                printf("taper le numéros de l'operation à supprimer:");
                scanf("%d",&numAsuprimmer);
          if (l==NULL)
              {
                printf("Attention ! il n'y a aucune opération à supprimer ");
                getch();
                return NULL;
              }  
                     if (l->suivant==NULL)
              {
               free(l);
               return NULL;
              }  
          else 
              {
                       liste tmp=l,avantTmp=l;
                      while ((tmp->suivant!=NULL)&&(tmp->inf_op.num_operation!=numAsuprimmer))
                                 {
                                  avantTmp=tmp;
                                  tmp=tmp->suivant ;
                                  }
                            if(tmp==NULL )
                                  {
                                  printf("le numéro de l'opération n' exite pas !");
                                  return NULL;
                                  }
                            else 
                                  {
                                  avantTmp->suivant=tmp->suivant;
                                 //free(tmp->inf_op);
                                 free(tmp);
                                  }
                 }
               return l;
     
    }
    je serai trés réconnaissantes aux personnes qui m'aide à s'en sortir !

  18. #18
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 121
    Points : 136
    Points
    136
    Par défaut
    1.si je supprime la 1 opération ,et j'affiche la liste ,je constate que au lieu de la 1 opération ,j'ai des caractére spéciaux
    C'est normal tu viens de le supprimer et tu n'as pas réajuster le début de ta liste ...
    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
    *liste suppresssion(liste l)
    {
       ...
       else 
          {
          /* Si tmp est le début de la liste... */
          if (l==tmp) 
              /* Réajuster le début de la liste (il n'y a pas de précédant) */
              l = tmp->suivant; 
          else 
              /* Réajuster le chainage du précédant */ 
              avantTmp->suivant=tmp->suivant;
          //free(tmp->inf_op);
          free(tmp);
          }
       }
       return l; /* Et maintenant l pointe bien le début de ta liste */
    }
    2.si je tape un numéro d'opération qui n'existe pas ,le compilateur il le considère comme si il existe !!!!(et dans ce cas il supprime la dernière opération )
    Parceque tu ne vas pas jusqu'au dernier élément de ta liste dans ta boucle...
    Ce test était pourtant juste dans ton premier listing pourquoi rajouter des erreurs ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    while (tmp != NULL && ...)
       {
       ...
       }
    if (tmp == NULL) /* J'ai été jusqu'au dernier sans succès ! */
     ...
    Troisième et dernière correction...Le test avant ta boucle supprime ta liste si il n'y a plus qu'un élément sans vérifier son numéro d'opération !!!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
           if (l->suivant==NULL)
              {
               free(l);
               return NULL;
              }
    ...
    Avec les deux corrections ci-dessus tu peux carrément enlever ces instructions.

Discussions similaires

  1. [MySQL] fonction delete qui ne marche pas
    Par bassiste dans le forum PHP & Base de données
    Réponses: 22
    Dernier message: 10/05/2008, 00h58
  2. VBA Access : Fonction find qui ne marche pas
    Par leeloo35 dans le forum VBA Access
    Réponses: 7
    Dernier message: 09/02/2008, 16h56
  3. Réponses: 18
    Dernier message: 06/10/2007, 23h03
  4. requete SQl avec la fonction max () qui ne marche pas
    Par eclipse012 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 09/11/2006, 14h32
  5. Une fonction settimeout qui s'execute pas
    Par stepon dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 03/08/2006, 11h55

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