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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Décembre 2009
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 128
    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 confirmé

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    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 confirmé
    Inscrit en
    Décembre 2009
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 128
    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 émérite
    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
    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 confirmé

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    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 confirmé
    Inscrit en
    Décembre 2009
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 128
    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 éprouvé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 121
    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).

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 121
    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.

  9. #9
    Membre confirmé
    Inscrit en
    Décembre 2009
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 128
    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 !

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