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 :

Perdu entre les pointeurs


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 183
    Par défaut Perdu entre les pointeurs
    Bonjour,
    Je me suis perdu entre les pointeurs et j'arrive plus à savoir comment faire pour supprimer un élément ajouté à ma liste chaînée
    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
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
     
       Vehicule *l=NULL;
        Vehicule *p=NULL;
        Vehicule *q=NULL;
        GestionMenu m;
        int id;
        int idt;
     
        while(1)
        { 
            m.MenuPrinc();
     
            switch(m.typepr)
            {
            case 1: system("cls"); m.menu_type();
                switch(m.typety)
                { 
                case 1: system("cls");p=new Bateau;
                    p->Saisie();
                    p->Affiche();
                    p->lien=l;l=p;
                    getch(); 
                    break;
                case 2: p=new Helicoptere;
                    p->Saisie();
                    p->Affiche();
                    p->lien=l;l=p;
                    getch();
                    break;
                case 3: p=new Vehicule_Roulant;
                    p->Saisie();
                    p->Affiche();
                    p->lien=l;l=p;
                    getch();
                    break;
                case 4: p=new Hovercraft;
                    p->Saisie();
                    p->Affiche();
                    p->lien=l;l=p;
                    getch();
                    break;
                case 5: if(p!=NULL)
                    {
                        delete l;delete p; delete q;
                    }
                    return 0;
                default: cout<<"\nchoix invalide\n";
                    break;
                }
                getch();
                break;
            case 2: cout<<"\nVeuillez saisir l'identifiant du vehicule a supprimer:\n";cin>>idt;
                /*q=l; if (q==NULL) cout<<"liste vide";
    else 
    {while ((q=!NULL)&(q->GetIdentifiant()!=id))
    { q=q->lien;}
    }*/
            case 3:cout<<"pas encore";getch();
                break;//pas encore faite
            case 4:cout<<"pas encore";getch();
                break;//pas encore faite
            case 5:cout<<"\nVeuillez saisir l'identifiant:\n";cin>>id;
                cout<<"\nLe vehicule recherche:\n";
                q=l;
                if(q==NULL) cout<<"liste vide";
                else
                { while ((q!=NULL)&(q->GetIdentifiant()!=id))
                    {
     
     
                        q=q->lien;
                    }
                    q->Affiche();
                }
                getch();
                break;
     
     
     
            case 6:cout<<"pas encore";getch();
                break;//pas encore faite
            case 7:cout<<"pas encore";getch();
                break;//pas encore faite
            case 8:cout<<"pas encore";getch();
                break;//pas encore faite
     
            case 9: m.menu_affich();
                switch(m.typeaf)
                {
                case 1:
                    cout<<"affichage de tous les vehicules\n";
                    q=l;
                    if(q==NULL) cout<<"liste vide";
                    else
                    { while (q!=NULL)
                        {
                            q->Affiche();
                            cout<<"\n--------------------------------------------\n";
                            q=q->lien;
                        }
                    }
                    getch();
                    break;
                case 2:
                    cout<<"affichage de tous les bateaux\n"; 
     
                    /*q=l;
    if(q==NULL) cout<<"liste vide";
    else
         { while ((q!=NULL)&(typeid(q)!=typeid(Bateau)))
     {
     
     
    q=q->lien;
     }
    q->affichage();
     }
    getch();
    break;
    */
     
                case 3:cout<<"pas encore";getch();
                    break;//pas encore faite
                case 4:cout<<"pas encore";getch();
                    break;//pas encore faite
                case 5:cout<<"pas encore";getch();
                    break;//pas encore faite
                }
            case 10:m.menu_stat();
                cout<<"pas encore";getch();
                break;
            case 11:
                if(p!=NULL)
                {
                    delete l;delete p; delete q;
                }
                return 0;
            default: cout<<"\nchoix invalide\n";
                break;
            }
            p=NULL;
        }
    }

  2. #2
    Membre Expert Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Par défaut
    Salut,

    ça ne m'étonne pas que tu ne saches plus comment faire une chose ou l'autre vu l'état de ton code. Tu dois absolument séparé ton code en fonction et module indépendant ! Ta liste est géré au milieu du truc, donc ce que tu dois faire c'est soit utiliser un container de la STL comme std::list ou std::vector, ou alors créer ta propre class list et coder les méthodes qui vont bien pour manipuler la liste. Mais dit toi que dans cette classe tu devrais être capable de manipuler des Voitures, des Cuisines, ou des Taille-crayons... Donc elle ne doit pas être dépendante de l'objet qu'elle manipule, et tu peux donc utiliser les template comme ça : template <class T> class List. Ainsi T sera soit une voiture, soit un Vehicule*, soit...

    Pour le moment, ta liste est dans Vehicule, ce qui est très mauvais. Donc change ça et tu y verras déjà plus clair.

  3. #3
    Membre expérimenté Avatar de Rewpparo
    Homme Profil pro
    Amateur
    Inscrit en
    Décembre 2005
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Amateur

    Informations forums :
    Inscription : Décembre 2005
    Messages : 170
    Par défaut
    Pas étonnant que tu te perdes.
    Déjà les noms de variables. Si tu ne mets pas des noms plus explicites, jamais tu t'en sortiras. Les 'p' et les 'l', ca va bien quand tu fais 20 lignes de code en cours, mais il va falloir t'habituer à donner des noms plus explicites à tes variables, pour toi comme pour ceux qui bossent avec toi et qui vont reprendre ton code derrière, comme pour ceux à qui tu demandes de l'aide.
    Personnellement j'y comprend rien, car tout ce que j'ai c'est une variable p, je sais que c'est un pointeur vers un véhicule, mais je peux pas deviner ce qu'elle est sensée faire, encore moins comment, et encore moins à quoi ce pointeur est sensé servir dans le bout de code en question.
    Mais même pour toi, si tu t'es "perdue dans tes pointeurs" c'est surement à cause de ca. Tu as perdu de vue la globalité de ton code parce que tes noms de variables ne sont pas explicites. Donne déja des noms à tes variables qui correspondent à leur fonction dans le code (pas "vehicule1" "vehicule2" par exemple, mais par exemple "affiche", "attente").

    L'indentation est manquante, j'espère que c'est une erreur de copier/coller parce que ca aide pas du tout la lisibilité. J'espère que tu indente bien chez toi.

    Enfin, décris mieux ton problème. "je me suis perdue dans les pointeurs", ca ne veut rien dire. As tu une segfault ? une erreur de compilation ? quelque chose qui ne fait pas ce qu'il faut ?

  4. #4
    Membre très actif
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 183
    Par défaut
    Vous avez certainement raison , mais dans le cadre d'un exercice donnépar notre prof je ne peux pas opter pour une autre solution tq les templates ou eclater le code en plusiseurs classes , ceci dis j 'ai pas vraiment le choix de faire autrement

  5. #5
    Membre Expert Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Par défaut
    Non ce n'est pas vrai, ton professeur serait surement content de voir que tu peux séparer ton code en différentes fonctions et déléguer les responsabilités à d'autres classes.

    Il ne faut pas toujours suivre les énoncés comme un petit toutou, et parfois en faire un peu plus que demander n'est pas extra-ordinaire. De plus, tu n'es pas obligé d'utiliser les templates, tu peux considérer que ta liste ne gère que des Vehicules, même si les templates ne rajoutent pas énormément de complexité...

  6. #6
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,
    Citation Envoyé par nourhene4 Voir le message
    Vous avez certainement raison , mais dans le cadre d'un exercice donnépar notre prof je ne peux pas opter pour une autre solution tq les templates ou eclater le code en plusiseurs classes , ceci dis j 'ai pas vraiment le choix de faire autrement
    Le but d'un exercice, c'est toujours de s'assurer que tu as compris le principe qui sous tend l'exercice donné...

    Sans meme envisager le passage vers une classe template, ton prof sera sans doute des plus content de constater que tu as "compris" le fait qu'il n'est jamais bon de se répéter, et qu'il est vingt fois mieux de factoriser ton code

    Si cela implique que tu vas créer une fonction (dont tu choisira judicieusement le nom ) qui t'évitera de recopier vingt fois une partie de code, ton prof ne pourra pas faire autrement que d'admettre le fait que tu as compris le sens de "factoriser son code"

    Et tant que ton code reste correct (qu'il n'y a pas d'avertissement à la compilation et que l'exécution fournit des résultats cohérents, y compris pour les cas plus ou moins "borderline") ton prof ne pourra pas faire autrement que d'accepter ta manière d'envisager les choses... D'autant plus que tu auras en main tout ce qu'il faut pour pouvoir justifier tes choix

    Ainsi, on trouve trois fois (ou plus) le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    p->Saisie();
    p->Affiche();
    p->lien=l;l=p;
    getch();
    avec, comme seul point de variation le type réel de p ...

    Tel que ton code est écrit, on se rend compte que p est, de toute évidence, un pointeur sur une classe de base !!!

    Dés lors, meme sans ajouter de fonction, pourquoi donc ne t'arrangerais tu pas pour que ce code ne doive etre écrit qu'une seule fois, une fois que le type réel de l'objet auquel il doit se rapporter est connu

    En effet, une modification simple de ton code pourrait se présenter sous une forme proche de
    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
    system("cls");
    switch(m.typety)
    { 
        case 1:p=new Bateau; 
            break;
        case 2: p=new Helicoptere;
            break;
        case 3: p=new Vehicule_Roulant;
             break;
        case 4: p=new Hovercraft;
             break;
        case 5: if(p!=NULL)
        {
            delete l;
            delete p; 
            delete q;
            l = NULL;
            p = NULL;
            q = NULL;
        }
    }
    if(p!= NULL)
    {
        p->Saisie();
        p->Affiche();
        p->lien=l;l=p;
        getch()
    };
    qui aurait (nonobstant le mauvais choix des noms de variables ) les avantages:
    1. de ne pas t'obliger à copier vingt fois la mem chose, avec les risques que cela comporte
    2. De clairement séparer la partie de ce qui doit être faite en fonction d'une input donnée et celle qui doit etre faite "de manière générale"
    Ensuite, on ne peut qu'insister une fois de plus sur certaines règles de codage qu'il est plus que vital (pour une relecture ultérieure, qu'elle ait lieu par toi, par les gens qui bossent avec toi, ou, comme c'est le cas présentement, pour ceux du forum qui acceptent d'essayer de t'aider ) de respecter de manière à ce que le code soit le plus facile possible à lire et à comprendre.

    L'identation correcte et cohérente et le bon choix du nom de variable (ou de fonction) sont primordiales pour permettre à tout lecteur de ton code:
    1. De repérer plus facilement les "blocs d'instructions" (avoue que mon exemple de code est plus facile à comprendre, rien que du fait que chaqe bloc est correctement indenté par rapport au précédent / suivant, non )
    2. De comprendre l'utilisation qui est faite des variables : p et l ne veulent pas dire grand chose, alors que si tu les renomme respectivement en actualPointer et nextItem (par exemple ), on sait d'office l'utilisation que l'on prévoit de faire de ces variables
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  7. #7
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    Bonjour nourhene4

    J'ai corrigé l'indentation de ton code, il était illisible. Du coup, il apparaît qu'il y a des problèmes avec tes blocs {}. Il faut que tu vérifies ça aussi

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. perdu dans les pointeurs
    Par Taiby dans le forum Débuter
    Réponses: 33
    Dernier message: 20/07/2010, 20h56
  2. Perdu dans les pointeurs
    Par sinfoni dans le forum Débuter
    Réponses: 2
    Dernier message: 26/05/2010, 11h37
  3. Réponses: 6
    Dernier message: 29/12/2009, 19h53
  4. Benchmark entre les langages
    Par El blérot dans le forum Langages de programmation
    Réponses: 4
    Dernier message: 27/12/2002, 01h22
  5. Réponses: 3
    Dernier message: 07/05/2002, 16h06

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