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 :

Soucis de pointeur


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2021
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2021
    Messages : 10
    Par défaut Soucis de pointeur
    Bonjour, je travaille actuellement sur un projet, qui a pour but de créer un binômes avec deux élèves que l’utilisateur saisie.
    Malheureusement je rencontre un problème lors de l'affichage du binômes d'un élèves, je sais qu'il y a une erreur d'accès a la mémoires du au lignes 56 a 61 mais je ne vois pas du-tout comment résoudre mon soucis.
    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
    /*POINTEURS ET TABLEAUX STATIQUE-- VILAIN -- 284I-- 24/10/2021 -- DEFINIR DES TYPES ET SAVOIR L'AFFCIHER*/
    #include <stdlib.h>
    #include <vector>
    #include <string>
    #include <unistd.h>
    #include <fstream>
    #include <stdio.h> // pour printf,scanf..
    #include <iostream> // pour cin, cout, endl
     
    using namespace std;
     
    struct t_etudiant {
        int NumEtu;
        string Nom;
        string Prenom;
        t_etudiant* Binome = NULL;
    };
     
    void ModifNom (t_etudiant* Etu, string Nom, string Prenom) {
        Etu->Nom = Nom;
        Etu->Prenom = Prenom;
    };
     
    void CreerBinome(t_etudiant* Etu1, t_etudiant* Etu2) {
        if (Etu1 && Etu2) {
            Etu1->Binome = Etu2;
            Etu2->Binome = Etu1;
        }
        else {
            cout << "Vos variables ne sont pas définit" << endl;
            exit(-1);
        }
    }
     
     
     
    void DetruireBinome(t_etudiant Etu1, t_etudiant Etu2) {
        if (Etu1.Binome == &Etu2 && Etu2.Binome == &Etu1) {
            Etu1.Binome = NULL;
            Etu2.Binome = NULL;
            cout << "Le Binome n'existe plus" << endl;
        }
        else {
            cout << "Il n'y a pas de Binomes avec ces éleves" << endl;
        }
    }
     
    void AffichageInformations(t_etudiant &Etu){
        cout << "INFORMATION etudiant" << endl;
        cout << "---------------------" << endl;
        cout << "Numero etudiant : " << Etu.NumEtu << endl;
        cout << "Nom: " << Etu.Nom << endl;
        cout << "Prenom: " << Etu.Prenom << endl;
        cout << "----------------------" << endl;
     
        cout << "INFORMATION SUR SON Binome" << endl;
        cout << "--------------------------" << endl;
        cout << "Numero etudiant : " << Etu.Binome->NumEtu << endl;
        cout << "Nom: " << Etu.Binome->Nom << endl;
        cout << "Prenom: " << Etu.Binome->Prenom << endl;
        cout << "---------------------------" << endl;
    }
     
    bool MauvaisNumEtu(int NumEtu, t_etudiant tab[], int nbElm) {
        bool estUtilise = false;
        for (int i = 0; i < nbElm; i++) {
            if (tab[i].NumEtu == NumEtu) {
                estUtilise = false;
            }
        }
        return estUtilise;
    }
     
    void SaisieInfoEtu(t_etudiant &Etu, t_etudiant tab[], int nbElm) {
        cout << "Saisissez le Numero etudiant" << endl;
        cin >> Etu.NumEtu;
        while (MauvaisNumEtu(Etu.NumEtu, tab, nbElm) || Etu.NumEtu < 0) {
            if (Etu.NumEtu < 0) {
                cout << "Le numero saisi doit être positif" << endl;
                cout << "Reesayer : " << endl;
                cin >> Etu.NumEtu;
            }
            if (MauvaisNumEtu(Etu.NumEtu, tab, nbElm)) {
                cout << "Ce numero est deja pris" << endl;
                cin >> Etu.NumEtu;
            }
        }
        cout << "Entrez le prenom de l'étudiant" << endl;
        cin >> Etu.Prenom;
        cout << "Entre le nom de l'étudiant" << endl;
        cin >> Etu.Nom;
        cout << "N'oubliez pas d'attribuer un Binome à cet étudiant" << endl;
        cout << endl;
     
    }
     
    int main() {
     
        //cout << "Quel est le nombre d'etudiant dans ce groupe" << endl;
        int nbetudiant = 2;
     
        if (nbetudiant > 0) { //On utilisera le tableau "dans" le if
            t_etudiant *groupeEtu = new t_etudiant[nbetudiant]; 
     
     
     
            for (int i = 0; i < nbetudiant; i++) {
                SaisieInfoEtu(groupeEtu[i], groupeEtu, nbetudiant);
            }
     
                AffichageInformations(groupeEtu[0]);
                AffichageInformations(groupeEtu[1]);
     
            delete[] groupeEtu;
        }
        else {
            cout << "Le nombre d'etudiant doit etre positif." << endl;
        }
     
     
     
        return 0;
    }
    Et affiche en sortie :
    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
    Saisissez le Numero etudiant
    98
    Entrez le prenom de l'étudiant
    YUn
    Entre le nom de l'étudiant
    Bui
    N'oubliez pas d'attribuer un Binome à cet étudiant
     
    Saisissez le Numero etudiant
    76
    Entrez le prenom de l'étudiant
    GHy
    Entre le nom de l'étudiant
    IT
    N'oubliez pas d'attribuer un Binome à cet étudiant
     
    INFORMATION etudiant
    ---------------------
    Numero etudiant : 98
    Nom: Bui
    Prenom: YUn
    ----------------------
    INFORMATION SUR SON Binome
    --------------------------
    Erreur de segmentation (core dumped)
    En espérant que vous pourriez m'aider
    Merci d'avance

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 119
    Billets dans le blog
    148
    Par défaut
    Bonjour,

    Pour ce genre de problème, le débogueur est votre meilleur ami. Je vous invite à lire cet article : https://alexandre-laurent.developpez...e-application/
    Autrement, en regardant rapidement, il me semble que vous n'allouez jamais votre binôme. Autrement dit, vous n'appelez jamais CreerBinome().
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Rédacteur/Modérateur


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

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Le problème serait plutôt DetruireBinome qui prend des copies, imo.
    En dehors d'includes inutiles, d'allocation dynamique en lieu de std::vector, du using std::vector, d'une struct avec fonctions libres au lieu de fonctions membres, des paramètres passés par copie un peu partout, un coup des pointeurs, un coup des références, l'utilisation de exit, et c'est déjà pas mal pour juste les 30 premières lignes.
    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.

  4. #4
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 766
    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 766
    Par défaut
    Oui c'est normal : dans ta fonction SaisieInfoEtu, tu saisies le nom, le prénom et le numéro.
    Donc, binôme reste à NULL. Soit tu crées ton binôme soit tu modifies ta fonction d'affichage lorsqu'il n'y a pas binôme (<- il faut d'ailleurs le faire parce que c'est 1 pointeur)

    Après ta fonction MauvaisNumEtu est fausse if (tab[i].NumEtu == NumEtu) { estUtilise = false; } (sans parler que tu peux mettre ton booléen dans la condition de sortie)

    Ensuite ton code : c'est du [mauvais] C avec des string, new/ delete, cout/ cin. Même tes includes sont du C.
    Donc je ne sais pas ce que tu apprends avec ce code, mais cela commence assez foutraque

  5. #5
    Membre Expert
    Femme Profil pro
    ..
    Inscrit en
    Décembre 2019
    Messages
    667
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 95
    Localisation : Autre

    Informations professionnelles :
    Activité : ..

    Informations forums :
    Inscription : Décembre 2019
    Messages : 667
    Par défaut
    Salut,

    En ajoutant un menu, ça sera plus clair.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Que voulez-vous faire ?
        a: ajouter un étudiant
        b: attribuer un binôme
    Ensuite il suffit d'appeler les fonctions concernées.

    Aussi, une initialisation du numéro d'étudiant à 0 permettra de compter les nombres d'étudiants: ceux restant à enregistrer, ceux qui le sont déjà (bien qu'avec les strings ça marche aussi). Le pointeur binôme NULL aidera aussi le comptage dans le même sens. Ainsi, dans la fonction ajouter un étudiant par exemple, à la fin, selon les résultats de comptages, il sera possible de demander à l'utilisateur s'il souhaite attribuer un binôme à l'étudiant en cours d'enregistrement ou bien de lui signifier de ne pas oublier de le faire. Et ainsi de suite "vers l'infini et au delà".

  6. #6
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 766
    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 766
    Par défaut
    Citation Envoyé par kaitlyn Voir le message
    Ainsi, dans la fonction ajouter un étudiant par exemple, à la fin, selon les résultats de comptages, il sera possible de demander ...
    Non c'est 1 mauvaise idée

    Il faut séparer les
    • fonctions/ méthodes propres - constructeur (il est où ?), destructeur (LOL comme il est mauvais), association de binômes, ...
    • les autres - saisie, affichage (as-tu remarqué que tu fais 2 affichages alors que tu n'as qu'à la rappeler pour afficher le binôme), ...

    Mais bon, c'est de l'exercice "test" qui est juste bon à faire tout 1 tas d'expérimentations donc

Discussions similaires

  1. Erreurs de segmentation !
    Par anti-conformiste dans le forum Applications et environnements graphiques
    Réponses: 16
    Dernier message: 18/10/2005, 11h11
  2. Erreur de segmentation
    Par Trunks dans le forum C
    Réponses: 3
    Dernier message: 06/10/2005, 18h28
  3. Erreur de segmentation (Inconnue)
    Par Dark-Meteor dans le forum C
    Réponses: 5
    Dernier message: 08/09/2005, 13h42
  4. [Dev-C++] Erreur de segmentation...
    Par sas dans le forum Dev-C++
    Réponses: 11
    Dernier message: 26/03/2005, 14h25
  5. erreur de segmentation
    Par transistor49 dans le forum C++
    Réponses: 10
    Dernier message: 15/03/2005, 11h18

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