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

Langage C++ Discussion :

problème avec les listes chaînées : suite


Sujet :

Langage C++

  1. #1
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 089
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 089
    Points : 1 055
    Points
    1 055
    Par défaut problème avec les listes chaînées : suite
    Dans un précédent post je vous montrais la construction d'une liste chaînée pour enregistrer des composants. Je la reporte ici :

    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
    int indComp = 0; // index du composant créé
     
    class CompBase; // déclaration forward du type CompBase
     
    struct PtrComp {
      CompBase *ptr; // liste chaînée de CompBase
      PtrComp *suiv; // pointeur sur le prochain élément de la liste
      PtrComp *ajoutComp(CompBase *pt) { // méthode d'ajout d'un élément chaîné
        PtrComp *nouvComp = new PtrComp;
        nouvComp->ptr = pt; // enregistrement du pointeur sur le composant créé
        nouvComp->suiv = NULL;
        suiv = nouvComp;
        return nouvComp;
      }
    };
     
    PtrComp *compDeb = new PtrComp; // pointeur sur le début de la liste
    PtrComp *compCour; // pointeur d'élément de liste
     
    class CompBase { // composant de base
    public:
      CompBase() { // constructeur
        if (indComp == 0) { // pour l'enregitrement du premier composant, je n'utilise pas la fonction ajout, mais ...
          compDeb->ptr = this; // ... comme il est déjà créé, je rempli seulement les cases
          compDeb->suiv = NULL;
          compCour = compDeb;
        }
        else {
          compCour = compCour->ajoutComp(this); // inscription dans la liste chaînée dès le deuxième composant
        }
        indComp++; // incrémente l'indice d'inscription dans le tableau des composants
      }
      int xx; // variable de test du composant
    };
    Cela fonctionne bien. Mais ce qui m’ennuie est que pour le premier élément, je n'utilise pas la méthode "ajout" et passe par un substitut lorsque indComp vaut "0"

    J'ai modifié l'appel à la construction de la liste chaînée de la manière suivante : les modifications sont en italiques dans les codes ci-dessus et ci-après

    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
    int indComp = 0; // index du composant créé
     
    class CompBase; // déclaration forward du type CompBase
     
    struct PtrComp { // rien n'est changé dans cette structure
      CompBase *ptr; // liste chaînée de CompBase
      PtrComp *suiv; // pointeur sur le prochain élément de la liste
      PtrComp *ajoutComp(CompBase *pt) { // méthode d'ajout d'un élément chaîné
        PtrComp *nouvComp = new PtrComp;
        nouvComp->ptr = pt; // enregistrement du pointeur sur le composant créé
        nouvComp->suiv = NULL;
        suiv = nouvComp;
        return nouvComp;
      }
    };
     
    PtrComp *compDeb; // pointeur sur le début de la liste : il n'est plus créé ici
    PtrComp *compCour; // pointeur d'élément de liste
     
    class CompBase { // composant de base
    public:
      CompBase() { // constructeur
        compCour = compCour->ajoutComp(this); // inscription dans la liste chaînée dès le premier composant
        if (indComp == 0)
          compDeb = compCour; // c'est à que je fixe la valeur de compDeb
        }
        indComp++; // incrémente l'indice d'inscription dans le tableau des composants
      }
      int xx; // variable de test du composant
    };
    Utilisant cette deuxième méthode, à la création du premier composant, un de ses paramètres n'est pas pris en compte. Je suppose que cela vient de la méthode d'enregistrement, mais je ne vois pas où.

    Si quelque chose vous saute aux yeux.

    Merci de votre aide.

    Pierre

  2. #2
    Membre averti
    Homme Profil pro
    Analyse système
    Inscrit en
    Novembre 2008
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2008
    Messages : 227
    Points : 311
    Points
    311
    Par défaut
    Quand alloues-tu compDeb, et surtout compCour, car pour pouvoir faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    compCour = compCour->ajoutComp(this);
    il faut que compCour ait été alloué au préalable.


    PS : Question qui peut paraitre idiote, mais pourquoi ne pas utilisé les listes chainées de la STL ?

  3. #3
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 089
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 089
    Points : 1 055
    Points
    1 055
    Par défaut
    Merci A.F_2.8 pour cette réponse.
    Citation Envoyé par AF_2.8 Voir le message
    Quand alloues-tu compDeb, et surtout compCour, car pour pouvoir faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    compCour = compCour->ajoutComp(this);
    il faut que compCour ait été alloué au préalable. ...
    compCour est alloué dans la méthode ajout en prenant la valeur de nouvComp

    Citation Envoyé par AF_2.8 Voir le message
    ... PS : Question qui peut paraitre idiote, mais pourquoi ne pas utiliser les listes chainées de la STL ?
    Je ne connais pas, je vais ce que c'est et si c'est compatible avec l'environnement Arduino.

    Cordialement.

    Pierre

  4. #4
    Membre averti
    Homme Profil pro
    Analyse système
    Inscrit en
    Novembre 2008
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2008
    Messages : 227
    Points : 311
    Points
    311
    Par défaut
    compCour n'est pas alloué, tu lui affectes un pointeur, il pointe donc sur des données existante, mais lorsque que tu l'utilises pour la première fois dans le constructeur, pour moi il n'a pas encore été alloué.

  5. #5
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 265
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 265
    Points : 6 686
    Points
    6 686
    Billets dans le blog
    2
    Par défaut
    La STL est la bibliothèque standard du c++. Elle est généralement livrée avec le compilateur. Elle définit tout un tas de classes et fonctions qui sont utiles dans la plupart des programmes. Arduino propose sa propre bibliothèque, qui ne contient pas de liste chaînée, mais il existe des adaptations de la stl sur arduino . Mais ça a l'air un peu galère, et surtout trop lourd (en terme de taille de l'exécutable).

    En revanche, du devrais faire l'effort de mieux nommer tes variables et fonctions. Ça a l'air de rien mais c'est réellement important. Par ex: CompBase -> BaseComposant, indComp -> component_index, etc. Le code compilé aura la même taille (si c'est ce qui te préoccupe), mais le code sera plus lisible, et surtout, ça te force à expliciter ce que tu es en train de programmer, et donc ça aide beaucoup à avoir une vision beaucoup plus claire du programme qu'on est en train d'écrire.

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 128
    Points : 33 049
    Points
    33 049
    Billets dans le blog
    4
    Par défaut
    Et tu te serais peut-être rendu compte que ce que fait ton "cas particulier" quand ça vaut 0 n'est vraiment pas loin (voire totalement identique ? c'est fatiguant, contre-productif et ça donne pas envie de lire ces noms.. et pi pourquoi la coloration syntaxique ne marche pas ?! ) à ce que fait ajouterComp..!

    Enfin, en pratique c'est toujours mieux d'avoir une classe qui est clairement la tête de list et qu'on ne manipule que cette tête et non les éléments courants, de début etc...
    >> Exercice typique des premières semaines de C en école.

    Btw, quid de la libération de la liste ?

  7. #7
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 089
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 089
    Points : 1 055
    Points
    1 055
    Par défaut
    Citation Envoyé par AF_2.8 Voir le message
    compCour n'est pas alloué, tu lui affectes un pointeur, il pointe donc sur des données existante, mais lorsque que tu l'utilises pour la première fois dans le constructeur, pour moi il n'a pas encore été alloué.
    Tu as raison, dans la partie modifiée, j'ai initialisé compCour :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PtrComp *compCour = new PtrComp; // pointeur d'élément de liste
    et cela fonctionne bien.

    Merci beaucoup.

    Pierre

  8. #8
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 089
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 089
    Points : 1 055
    Points
    1 055
    Par défaut
    Citation Envoyé par r0d Voir le message
    La STL est la bibliothèque standard du c++.... mais il existe des adaptations de la stl sur arduino. Mais ça a l'air un peu galère, et surtout trop lourd (en terme de taille de l'exécutable). ...
    Je vais voir de quoi il en retourne et si ce n'est pas trop lourd, je vais m'en servir, mais cela nécessite un apprentissage supplémentaire du C++ pour moi car pour l'instant, je suis vraiment un débutant dans ce langage.

    Citation Envoyé par r0d Voir le message
    ... En revanche, du devrais faire l'effort de mieux nommer tes variables et fonctions. Ça a l'air de rien mais c'est réellement important. Par ex: CompBase -> BaseComposant, indComp -> component_index, etc. Le code compilé aura la même taille (si c'est ce qui te préoccupe), mais le code sera plus lisible, et surtout, ça te force à expliciter ce que tu es en train de programmer, et donc ça aide beaucoup à avoir une vision beaucoup plus claire du programme qu'on est en train d'écrire.
    Je suis bien conscient que la taille du programme compilé n'a rien à voir avec la taille du nom des variables.

    Je te suis dans ton raisonnement sur des noms de variable explicites. Pour autant, cela fait 30 ans que je programme en Pascal objet avec des noms qui sont, je le reconnais, des contractions pas très lisibles ... pour les autres. J'ai adopté cela car, pour moi, je préfère avoir des noms relativement courts (mais que je comprends) plutôt que d'avoir à lire des lignes interminables dues à des noms assez longs. D'autant plus qu'en C++ on ne bénéficie par de l'instruction "with" du Pascal (à manier avec circonspection) qui permet d'abréger les lignes de code.

    Cordialement.

    Pierre

  9. #9
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 089
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 089
    Points : 1 055
    Points
    1 055
    Par défaut
    Citation Envoyé par Bousk Voir le message
    Et tu te serais peut-être rendu compte que ce que fait ton "cas particulier" quand ça vaut 0 n'est vraiment pas loin (voire totalement identique ? ...
    C'est bien pour cela que j'ai voulu modifier le programme en supprimant ce cas particulier, mais j'ai mal initialisé les variables.

    Citation Envoyé par Bousk Voir le message
    et pi pourquoi la coloration syntaxique ne marche pas ?! ) à ce que fait ajouterComp..! ...
    Tu parles de la coloration sur le forum ?

    Citation Envoyé par Bousk Voir le message
    ... Enfin, en pratique c'est toujours mieux d'avoir une classe qui est clairement la tête de list et qu'on ne manipule que cette tête et non les éléments courants, de début etc...
    >> Exercice typique des premières semaines de C en école. ...
    C'est ce que j'essaie de faire : rappel : je suis vraiment un débutant en C++ et j'ai déjà dû dire quelque part que la syntaxe de ce langage me donne des boutons . Bon, mais il faut que je m'y fasse.

    Citation Envoyé par Bousk Voir le message
    ... Btw, quid de la libération de la liste ?
    Comme la mémoire vive disponible sur ma carte Arduino n'est que de 8 ko pour le tas et la pile, je ne m'amuse pas encore avec les problèmes liés à la fragmentation. Par ailleurs, ma liste chaînée est valide, pour l'instant, pour toute la durée du programme.

    Cordialement.

    NOTA : peut-être ne vous en rendez-vous pas compte, mais j'essaie d'appliquer les remarques que vous me faites .

    Pierre.

  10. #10
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 629
    Points : 30 692
    Points
    30 692
    Par défaut
    Salut,
    Citation Envoyé par Bousk Voir le message
    et pi pourquoi la coloration syntaxique ne marche pas ?! ) à ce que fait ajouterComp..!
    Parce que ChPr avait utilisé des balises de BBCode ( [ B ] [ /B ], [ I ] [ /I ]) à l'intérieur de ses balises code et que c'est incompatible avec le système de coloration syntaxique automatique.

    J'ai corrigé ses codes

  11. #11
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 265
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 265
    Points : 6 686
    Points
    6 686
    Billets dans le blog
    2
    Par défaut
    <mode: vieux grognon>
    Citation Envoyé par ChPr Voir le message
    Je te suis dans ton raisonnement sur des noms de variable explicites. Pour autant, cela fait 30 ans que je programme en Pascal objet avec des noms qui sont, je le reconnais, des contractions pas très lisibles ... pour les autres.
    J'ai du mal avec cette façon de voir les choses. Tu ne programmes que pour toi. Je plains ceux qui travaillent avec toi. Et puis tu viens demander de l'aide sur un forum, et tu ne prends même pas la peine de poster un code compréhensible... pour les autres.
    </mode>

    Bonne chance avec ton arduino tout de même, c'est vraiment super amusant ce truc.

  12. #12
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 089
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 089
    Points : 1 055
    Points
    1 055
    Par défaut
    Citation Envoyé par r0d Voir le message
    ... J'ai du mal avec cette façon de voir les choses. Tu ne programmes que pour toi. Je plains ceux qui travaillent avec toi. Et puis tu viens demander de l'aide sur un forum, et tu ne prends même pas la peine de poster un code compréhensible... pour les autres. ...
    Bien qu'ayant réalisé et commercialisé un logiciel de simulation d'automatisme, je n'ai jamais eu à travailler en équipe pour de la programmation. Ce n'est pas mon métier de base.

    Maintenant, depuis que je me suis mis au C++, j'ai écouté et appliqué au mieux les remarques qui m'ont été faites. Cependant, je contracte toujours mes noms de variables. Pour autant, elles ne sont pas si incompréhensibles que cela car, m'en proposant une écriture plus explicite, tu en avais aisément trouvé la signification .

    Mais bon, je ferai l'effort d'être plus précis lorsque je ferai appel à vous.

    Cordialement.

    Pierre

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

Discussions similaires

  1. problème avec les listes chaînées.
    Par ChPr dans le forum Langage
    Réponses: 3
    Dernier message: 12/09/2013, 15h54
  2. Problème avec les listes chaînées
    Par Kawada dans le forum C
    Réponses: 2
    Dernier message: 06/05/2012, 17h20
  3. Problème avec les listes chaînées
    Par yous18 dans le forum C
    Réponses: 38
    Dernier message: 25/10/2007, 22h30
  4. [TP 7] Problème avec les listes chaînées (error 202)
    Par thelinekioubeur dans le forum Turbo Pascal
    Réponses: 4
    Dernier message: 06/12/2006, 23h15

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