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 :

[Débutant]Structure Tableau, initialisation


Sujet :

C++

  1. #1
    Membre averti
    Inscrit en
    Mars 2006
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 53
    Par défaut [Débutant]Structure Tableau, initialisation
    Bonjour à tous.
    J'ai crée un petit programme de gestion de stock. Dans mon code j'ai une liste de produit. Produit est une structure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    struct produit
    {
           char code[10];
           char libelle[50];
           double quantite ;
    } ;
    Liste est aussi une structure contenant un en entier et un tableau de produit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    struct liste
    {
           produit t[nb_max];
           int nb;
    };
    Tout le monde suit pour l'intant
    Ensuite je vais manipuler cette liste (ajout, suppression de produit, affichage de la liste,..)
    Pour cela, je veux en debut de programme initialiser la liste à vide, cad nb=0, et sans produit, donc le tableau vide.
    J'ai mis cette fonction que j'apelle en debut de programme dans mon main.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void init(liste l)
    {
         l.nb=0;
    }
    Voila dans le main je fais donc juste un init ( l ) ; (j'ai declarer l juste avant).

    Mon probleme c'est que lorque je vais afficher la liste des le debut du programme, celle-ci n'est pas vide. Elle est meme rempli, avec des caractère spéciaux, l'affichage (qui affiche tous les produits) fait meme planter le programme. Je ne comprend. Je pense que ca viens de l'intitialisation de la liste.
    Voilà, j'èspère avoir été le plus clair possible. Merci de me dire ce qui cloche dans mon programme.

  2. #2
    Membre averti
    Inscrit en
    Mai 2006
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 23
    Par défaut
    Quand tu créé un tableau statique, ton compilateur ne fais que reserver de l'emplacement mémoire pour ton tableau, cette emplacement mémoire n'est pas mis à zero et peu tres bien contenir des valeurs.

    Toujours initialiser les variables avant de les utiliser.

    D'ailleurs vu que tu utilises le C++, je pense que tu devrais gerer ton projet avec des objets plutot que des structures, où la c'est dans le constructeur que tu poura initialiser tes tableau.

  3. #3
    Membre averti
    Inscrit en
    Mars 2006
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 53
    Par défaut
    Ok, merci, c'est ce un peu que je pensais, mais comment l'initialiser a vide le tableau ?

  4. #4
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Pourquoi ne pas utiliser std::vector<produit> qui fait exactement ce dont tu as besoin tout en étant éprouvé et fiable ?

  5. #5
    Membre averti
    Inscrit en
    Mars 2006
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 53
    Par défaut
    Parceque que je ne connaissais pas, lol. Je vais essayer. Merci

  6. #6
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    D'ialleurs, ton init prend en argument une liste l par valeur, donc la vraie liste l ne sera jamais modifiée, et donc jamais initialisée

  7. #7
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Sinon pour répondre à ta question :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void init(liste l)
    {
         l.nb=0;
    }
    Va travailler sur une copie de ta liste.

    Pour travailler sur l'original il faut la passer par référence :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void init(liste& l)
    {
         l.nb=0;
    }
    EDIT : oups grillé

  8. #8
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    ben non, tu donnes la solution, pas moi

  9. #9
    Membre averti
    Inscrit en
    Mars 2006
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 53
    Par défaut
    Ok super ca marche. Merci Laurent Gomila . Par contre j'aimerais savoir pourquoi il faut passer par une référence. A quoi ca sert?
    Car je vais sans doute devoir la réutiliser dans mon programme.

  10. #10
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    La référence indique qu'on ne va pas recopier la liste, on ne créera pas de nouvelle instance, c'est la même que celle qui est appelée qui sera utilisée. C'est comme un pointeur sauf qu'on ne s'amuse pas avec les '*'. Sans la référence, on va recopier dans une variable locale la variable passée en argument et qu'on aimerait bien initialiser.

  11. #11
    Membre émérite

    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 634
    Par défaut
    Cela sert à ce que l'objet ne soit pas copié, et que l'on travaille sur l'objet réel passé en paramètre et pas une copie temporaire. De la même manière que les pointeurs, mais de manière plus simple et plus sécurisée.

    Pour plus d'infos lis cette page : http://c.developpez.com/faq/cpp/?page=references

  12. #12
    Membre averti
    Inscrit en
    Mars 2006
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 53
    Par défaut
    Super merci, vous etes très rapide a répondre.
    Je pense pouvoir y arriver maintenant.

  13. #13
    Membre averti
    Inscrit en
    Mars 2006
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 53
    Par défaut
    Me revoilà, Alors jai de nouveau un probleme. J'utilise bien les references pour ka fonction init(). Celle-ci fonctionne mais pour certaine j'ai ce message d'erreur [Linker error] undefined reference to `ajouter(liste, produit)' .
    Cela se produit sur la fonction :

    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
    int ajouter(liste &l, produit &p)
    {
        int r=0;
        bool existe=false;
        int i=0;
     
        if (l.nb==nb_max)
             r=liste_pleine;
        else {
             while 
                   (i<l.nb && existe==false)
                   if ( strcmp(l.t[i].code, p.code)==0)
                      existe=true;
                   else i++ ;
     
                    if (existe)
                       r=existe_deja;
                    else {
                         l.t[l.nb]=p;
                         l.nb++;
                         }
        }
             return r;
    }
    Edit : En fait je comprend pas toujours qd l'utiliser la reference. Parfois ca marche parfois non. Par exemple pour ma fonction affiche(liste l), si je met une reference ca marche pas (meme erreur que plus haut), si je ne la met pas l'affichage s'effectue correctement. J'ai un peu de mal a tout saisir la

  14. #14
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    T'as bien le même prototype dans tes en-têtes ?

  15. #15
    Membre averti
    Inscrit en
    Mars 2006
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 53
    Par défaut
    En fait, l'erreur apparaissait car je faisait F9" compilier et réexecuter", en mettant Ctrl+F11 "tout reconstruire", ca marche. Autant pour moi . J'utilise donc les références pour toute mes fonctions, et ca marche. En tout cas merci pour tout. Tout fonctionne dans mon programme maintenant

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 06/05/2011, 13h38
  2. Fichier + structure + tableau
    Par Deejoh dans le forum C
    Réponses: 4
    Dernier message: 03/12/2005, 16h45
  3. [Débutant] [Conseil] Tableau ou vector
    Par nana1 dans le forum Collection et Stream
    Réponses: 11
    Dernier message: 04/11/2005, 09h56
  4. TAD matrice (structure + tableau dynamique)
    Par supermanu dans le forum C
    Réponses: 10
    Dernier message: 13/11/2004, 20h04
  5. [Débutant] Tri tableau String
    Par Sigwald dans le forum Collection et Stream
    Réponses: 22
    Dernier message: 14/05/2004, 08h55

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