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 :

c++ début pointeur fault


Sujet :

C++

  1. #1
    bm
    bm est déconnecté
    Membre confirmé

    Homme Profil pro
    Freelance
    Inscrit en
    Octobre 2002
    Messages
    874
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Freelance
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Octobre 2002
    Messages : 874
    Points : 556
    Points
    556
    Billets dans le blog
    6
    Par défaut c++ début pointeur fault
    bonjour ,

    Je veux utiliser 5 pointeurs pour enregistrer 5 films :

    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
    struct filmo{
        char titre[40];
        int annee;
    }cine1[5], *cine2[5];
     
    int main()
    {
        int an;
        cine2[5]=&cine1[5];
        int i,nbm;
        cout << "Nombre de film à traiter : ";
        cin >> nbm;
     
        // boucle de saisie
        for (i=0;i<nbm; i+=1){
            cout << "Titre du film :";
            cin >> cine2[i]->titre,40;
            cout << "Année : "  <<endl;
            cin >> an;
            cine2[i]->annee=an;
     
        }
        cout << "------------------" <<endl;
           // boucle affichage
           for (i=0;i<nbm; i+=1){
            cout << cine2[i]->titre << " - Année : " <<cine2[i]->annee <<endl;
        }
        return 0;
    }
    Segmentation fault


  2. #2
    Membre émérite Avatar de Cirrus Minor
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2014
    Messages
    953
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2014
    Messages : 953
    Points : 2 610
    Points
    2 610
    Par défaut correction
    Tu dois initialiser chaque objet.
    Tu peux ajouter un new dans ta boucle for, comme ça: cine2[i] = new filmo;


    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
    struct filmo{
        char titre[40];
        int annee;
    }cine1[5], *cine2[5];
     
    int main()
    {
        int an;
        int i,nbm;
        cout << "Nombre de film à traiter : ";
        cin >> nbm;
     
        // boucle de saisie
        for (i=0;i<nbm; i+=1){
            cine2[i] = new filmo;
            cout << "Titre du film :";
            cin >> cine2[i]->titre,40;
            cout << "Année : "  <<endl;
            cin >> an;
            cine2[i]->annee=an;
     
        }
        cout << "------------------" <<endl;
           // boucle affichage
           for (i=0;i<nbm; i+=1){
            cout << cine2[i]->titre << " - Année : " <<cine2[i]->annee <<endl;
        }
        return 0;
    }

  3. #3
    bm
    bm est déconnecté
    Membre confirmé

    Homme Profil pro
    Freelance
    Inscrit en
    Octobre 2002
    Messages
    874
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Freelance
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Octobre 2002
    Messages : 874
    Points : 556
    Points
    556
    Billets dans le blog
    6
    Par défaut
    ok - si je fais ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    struct filmo{
        char titre[40];
        int annee;
    }cine1[2], *cine2[2];
    Avec nombre de film : 4

    cine2 a plus que de 2 éléments , pas d'erreur et la boucle affiche
    les 4 films .. le pointeur est un tableau bien plus grand que 2

    cine1[1], *cine2[1]; // combien d'objet sont créés en théorie sous ce format ?

    C'est le pointeur qui a une référence différente sur chaque objet cine1
    Et il retrouve tous les références dans une pile externe au pointeur ( .. )

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 069
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 069
    Points : 12 113
    Points
    12 113
    Par défaut
    Laissez tomber les tableau à la C, il y a std::array et std::vector en C++.

    Votre déclaration ne fait que réserver de la mémoire pour ce tableau.
    Mais de la mémoire existe autour de celle-ci.
    En vous baladant dans la mémoire avec des indices supérieurs, vous ne faite que regarder de la mémoire que vous n'avez pas réservé, c'est tout.

    Avec les classes C++, vous ne vous baladez pas dans la mémoire comme un destructeur planétaire en quête d'un astre à détruire.

  5. #5
    bm
    bm est déconnecté
    Membre confirmé

    Homme Profil pro
    Freelance
    Inscrit en
    Octobre 2002
    Messages
    874
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Freelance
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Octobre 2002
    Messages : 874
    Points : 556
    Points
    556
    Billets dans le blog
    6
    Par défaut
    ok , le but à mon niveau , est de m'approprier des concepts .
    Le développement performant viendra beaucoup plus tard ..
    Les classes c'est l'étape suivante après les structures !

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 069
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 069
    Points : 12 113
    Points
    12 113
    Par défaut
    C'est quoi ton cours de C++ tout pourri ?

    On n'utilise plus les tableaux à la C et les structures en C++, c'est des classes.

    Tu perds ton temps à comprendre comment ne SURTOUT PAS coder.

    Les classes dont je parle, c'est std::array et std::vector, vous n'avez pas à connaitre comment construire les classes pour vous en servir.

    Donc arrêtez de fureter dans la mémoire n'importe comment avant l'accident fatal.

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 629
    Points : 10 554
    Points
    10 554
    Par défaut
    Citation Envoyé par bm Voir le message
    ok , le but à mon niveau de m'approprier des concepts .
    Le développement performant viendra beaucoup plus tard ..
    Les classes c'est l'étape suivante après les structures !
    Dans un sens en C++, les structures sont des classes avec une encapsulation par défaut publique et non pas privée

    Je te propose cela (mais non testé, et mon code fait [beaucoup] beaucoup de recopies )
    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
    #include<iomanip>
    #include<iostream>
    #include<string>
     
     
    typedef struct s_Movie {
     
        friend std::ostream& operator<< (std::ostream& os, const s_Movie& movie) {
            os << "title: " << std::setw(40) << std::setiosflags(std::ios::left) << movie.title
               << std::resetiosflags(std::ios::left) << " (" << movie.year << ")";
     
            return os;
        }
     
     
    public:
     
        s_Movie(): year(0) {
            std::memset(title, '\0', (len + 1));
        }
     
        s_Movie(const char* new_title, unsigned short new_year) {
            if (new_title == NULL) { year = 0; std::memset(title, '\0', (len + 1)); return; }
     
            std::copy(new_title, new_title + len, title);
    // or   std::strncpy(title, new_title, len);
            title[len] = '\0';
     
            year = new_year;
        }
     
        s_Movie& operator= (const s_Movie& other_movie) {
            std::copy(other_movie.title, other_movie.title + len, title);
    // or   std::strncpy(title, other_movie.title, len);
            title[len] = '\0';
     
            year = other_movie.year;
     
            return *this;
        }
     
     
    private:
     
        static const unsigned len = 40;
     
        char title[len + 1];
        unsigned short year;
    } Movie;
     
     
    typedef struct s_List_Movies {
     
        friend std::ostream& operator<< (std::ostream& os, const s_List_Movies& list) {
            for(unsigned short movie = 0; movie < list.nb_movies; ++movie) {
                os << std::setw(2) << (movie + 1) << ": " << list.list_movies[movie] << std::endl;
            }
     
            return os;
        }
     
     
    public:
     
        s_List_Movies(): list_movies(NULL), nb_movies(0), max_nb_movies(0) {}
     
        ~s_List_Movies() {
            if (list_movies != NULL) {
                delete[] list_movies;
            }
            list_movies = NULL;
            max_nb_movies = nb_movies = 0;
        }
     
        void add_movie(const Movie& new_movie) {
    //      XXX TODO: manage case list_movies == NULL
            if (nb_movies == max_nb_movies) {
                reserve(nb_movies + 1);
            }
     
            list_movies[nb_movies] = new_movie;
            ++nb_movies;
        }
     
        void reserve(unsigned short new_max_nb_movies) {
            if (new_max_nb_movies == 0) { return; }
     
    //      XXX TODO: manage case list_movies == NULL
            if (new_max_nb_movies > max_nb_movies) {
                Movie* tmp_list_movies = new Movie[new_max_nb_movies];
     
                for(unsigned short movie = 0; movie < nb_movies; ++movie) {
                    tmp_list_movies[movie] = list_movies[movie];
                }
     
                delete[] list_movies;
                list_movies = tmp_list_movies;
                max_nb_movies = new_max_nb_movies;
            }
        }
     
     
    private:
     
        Movie* list_movies;
        unsigned short nb_movies;
        unsigned short max_nb_movies;
    } List_Movies;
     
     
    int main(int argc, char* argv[])
    {
        Movie a("Test",  1940);
        Movie b("Test1", 1945);
        Movie c("Test2", 1947);
     
        List_Movies list;
     
        list.reserve(3);
     
        list.add_movie(a);
        list.add_movie(b);
        list.add_movie(c);
     
        std::cout << list << std::endl;
     
        return 0;
    }
    Édit: J'ai remplacé les fonctions memset et strncpy par celles de la STL ou de la bibliothèque standard

  8. #8
    Rédacteur/Modérateur


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

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 965
    Points
    32 965
    Billets dans le blog
    4
    Par défaut
    char*, strcpy, C-array ?
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  9. #9
    bm
    bm est déconnecté
    Membre confirmé

    Homme Profil pro
    Freelance
    Inscrit en
    Octobre 2002
    Messages
    874
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Freelance
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Octobre 2002
    Messages : 874
    Points : 556
    Points
    556
    Billets dans le blog
    6
    Par défaut
    La critique de la source que j'utilise est ici ( " Aucun point n'est jamais abordé en détail " )

    Mes questions suivantes ne seront pas posées au hasard ..

    http://cpp.developpez.com/livres/ind...us#L2100543296

    Commencer direct avec un projet c++ ( mastermind ou autres , serait mieux ) .
    Pour réaliser des simulations dans des fenêtres cela ferait gagner du temps , en évitant
    des concepts peu utilisés ..

    Les best seller sont vites épuisés !


  10. #10
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 069
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 069
    Points : 12 113
    Points
    12 113
    Par défaut
    Pas brillant, ce 3/5, mais c'est aussi la plus mauvaise note.
    Bouquin avant la révolution C++11 de 2011, c'est bon pour servir de cale ton bouquin.

  11. #11
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Citation Envoyé par bm Voir le message
    Le développement performant viendra beaucoup plus tard ..
    Ce n'est pas une question de "performance", mais d'écrire du code sûr. Et pour ça, il est indispensable d'acquérir les bons automatismes dès le début, avant de regarder sous le capot.
    (et regarder sous le capot correspondra à ré-implémenter des classes de la STL pour voir comment ça marche, puis jeter les ré-implémentations aux oubliettes car elle ne feront jamais le boulot aussi bien que la vraie version)

    Même avant C++11, personne ne devrait utiliser des tableaux C là où std::vector ferait mieux l'affaire; le gain en sûreté du code est bien trop grand pour qu'il en soit autrement.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  12. #12
    bm
    bm est déconnecté
    Membre confirmé

    Homme Profil pro
    Freelance
    Inscrit en
    Octobre 2002
    Messages
    874
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Freelance
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Octobre 2002
    Messages : 874
    Points : 556
    Points
    556
    Billets dans le blog
    6
    Par défaut
    Les rappels du C dans un manuel C++ , ne viennent pas de moi ..

    Faudrait séparer la question du forum avec l'écriture d'un livre de 2010 !

    Dunod peut recevoir des critique sur son site . En tant que débutant dans
    d'autres domaines , j'ai déjà fait cet effort sur des livres plus ardus qui
    pondent des résultats en oubliant les sources .


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

Discussions similaires

  1. Réponses: 2
    Dernier message: 24/02/2010, 10h38
  2. segmentation.fault pointeur ->de.*m.
    Par PhilippeHen dans le forum Débuter
    Réponses: 5
    Dernier message: 05/08/2009, 16h51
  3. Début avec les pointeurs
    Par stallaf dans le forum Débuter
    Réponses: 13
    Dernier message: 07/04/2008, 18h23
  4. Réponses: 2
    Dernier message: 01/01/2008, 19h35
  5. [MySQL] Remettre un pointeur au début d'un jeu de données
    Par Philippe PONS dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 08/12/2007, 11h46

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