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 :

Erreur de segmentation


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2013
    Messages : 7
    Par défaut Erreur de segmentation
    Bonjour,

    Je suis entrain de concevoir un serveur en C qui gère la connexion des joueurs (Jeu en ligne ). Dans mon application, quand les joueurs se connectent, je dois leur envoyer une notification comme quoi la partie peut commencer. Pour cela j'ai utilisé une pile du genre :
    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
     
    typedef struct Joueur
    {
    char *nom;
    int type ;/*dessinateur ou chercheur */
    int score;
    int socket_id;
    struct Joueur *suivant;
    }*Joueur;
     
    /*file des joueurs */
    typedef struct FileJoueur
    {
    int taille;
    Joueur *premier;
    }*FileJoueur;
    Par ailleurs, j'ai une fonction EnvoyerRole pas encore complète :
    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
     
    void EnvoyerRole(FileJoueur *fileJoueur,char role,char* MotADessinser)
    {
    char* message;
    strcat(message,"NEW_ROUND/");
    strcat(message,role);
    strcat(message,"/");
    strcat(message,MotADessiner);
    if(fileJoueur==NULL)
    exit(EXIT_FAILURE);
    Joueur *joueur=(*fileJoueur)->premier;
    while(joueur!=NULL)
    {
    /*un pti teste pour voir que sa marche */
    printf(" le descripteur du socket est %d et le nom du client %s \n",(*joueur)->socket_id,(*joueur)->nom);
    joueur=(*joueur)->suivant;
    }
    }
     
     
    /*appele de la fonction quelque part dans le code du genre */
    char *aDessiner="Mot a dessiner";
    EnvoyerRole(&mesJoueurs,'0',aDessiner);
    Mais j'ai une erreur de segmentation

    PS: mesJoueurs contient des elements

  2. #2
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Par défaut
    C'est le bon moment pour apprendre à utiliser un debugger.

    Quand ton programme plante, il doit produire un core. Si ce n'est pas le cas, fait "ulimit -c unlimited" dans ta console, relance ton programme, et tu dois te retrouver avec un beau fichier nommé "core".

    Donc, compiles ton programme avec -g (pour avoir les numéros de ligne), et lance le de façon a produire un core. Ensuite tu fais :

    Et tu te retrouves à l'endroit exact où le programme à planté (tu peux voir où tu es avec "where"). Tu peux inspecter des variables et faire plein de choses intéressantes.

    Ensuite il est aussi possible de placer des breakpoints, d'exécuter ton programme dans le debugger, de faire du pas à pas...

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    Il suffit de lire quatre lignes de ton second code pour tomber sur le premier problème:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char* message;
    strcat(message,"NEW_ROUND/");
    PAF! Déréferencement d'un pointeur non-initialisé.
    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.

  4. #4
    Membre Expert
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    872
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 872
    Par défaut
    @gooogl3r: Non, ca c'est un segfault bien degueulasse dans les regles de l'art.

  5. #5
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 487
    Par défaut
    Citation Envoyé par gooogl3r Voir le message
    Merci pour la réponse et c'est intéressant cependant je peut déboguer juste a partir de mon terminal sans utiliser un IDE ?
    Oui.

    Citation Envoyé par gooogl3r Voir le message
    effectivement mais c'est juste un warning pas plus
    Un warning, c'est un avertissement qui t'indique qu'il y a quelque chose de louche. Et si ça paraît louche au compilateur, c'est sans doute pour une bonne raison. Efforce-toi de n'en avoir plus aucun dans la version finale de ton exécutable. Tu peux passer à gcc l'option « -Werror » qui lui demande de considérer tous les avertissements comme d'authentiques erreurs, stoppant la compilation.

    En l'occurrence, « char * » n'est pas en soi une chaîne de caractères : c'est un pointeur vers le premier d'une suite de caractères, chaîne qui n'existe pas encore. Ton pointeur est non initialisé et sa valeur peut pointer n'importe où. Et dans tous les cas, ça se passera forcément mal puisque tu n'as alloué aucun espace pour cette chaîne.

  6. #6
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2013
    Messages : 7
    Par défaut
    Merci Les amis pour vos conseils ...maintenant sa marche sans aucun warning et effectivement vous aviez raison parce que quand j’initialise mes pointeurs y a plus de warning et il manqué quelque malloc un peu partout...merci beaucoup

  7. #7
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2013
    Messages : 7
    Par défaut
    @matafan :
    Merci pour la réponse et c'est intéressant cependant je peut déboguer juste a partir de mon terminal sans utiliser un IDE ?

    @Médinoc :
    effectivement mais c'est juste un warning pas plus

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

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