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

Réseau C Discussion :

Segmentation fault incomprehensible


Sujet :

Réseau C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Par défaut Segmentation fault incomprehensible
    Bonjour,

    J'ai un segmentation fault assez bizarre, et surtout tres ennuyeux car je n'arrive pas à le résoudre
    J'utilisa la structure suivante :
    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
    	typedef struct
    	{
    		GtkWidget *pFenetre;			/* Fenetre principale */
    		GtkWidget *pLbIp;					/* Label IP */
    		GtkWidget *pLbPort;			/* Label Port */
    		GtkWidget *pLbLogin;			/* Label Login */
    		GtkWidget *pLbMdp;			/* Label Mot de passe */
    		GtkWidget *pLbDest;			/* Label destinataire */
    		GtkWidget *pLbMsg;			/* Label message */
    		GtkWidget *pZsIp;				/* Zone saisie IP */
    		GtkWidget *pZsPort;			/* Zone saisie Port */
    		GtkWidget *pZsLogin;			/* Zone saisie Login */
    		GtkWidget *pZsMdp;			/* Zone saisie Mot de passe */
    		GtkWidget *pZsDest;			/* Zone saisie destinataire */
    		GtkWidget *pZsMsg;			/* Zone saisie message */
    		GtkWidget *pBtConnect;	/* Bouton de connection */
    		GtkWidget *pBtQuit;				/* Bouton quitter */
    		GtkWidget *pBtSend;			/* Bouton d'envoie */
    		GtkWidget *pZtInfos;			/* Zone de texte */
    		SOCKET maSocket;
    	}data;
    Voici la fonction qui pose probleme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void connection(gpointer donnees)
    {
    	data* pData = donnees;
     
    	/*Creation socket */
    	pData->maSocket = socket(PF_INET,SOCK_STREAM,0);
    }
    gpointer = void *
    Le main :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int main(int argc, char* argv[])
    {
       /* Declaration des variables */
       data pData;
       /*Connection du signal click de chaque bouton à la fonction appropriée*/ 	g_signal_connect(G_OBJECT(pData.pBtConnect),"clicked",G_CALLBACK(connection),&pData);
       /* ... */
       return 0;
    }
    Je ne comprend pas du tout pourquoi j'ai un segmentation fault lors de l'instruction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pData->maSocket = socket(PF_INET,SOCK_STREAM,0);
    Surtout que quand je fais :
    Ca passe...

    Merci pour votre aide

  2. #2
    Membre émérite
    Profil pro
    Eleveur de cornichons
    Inscrit en
    Juin 2002
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Eleveur de cornichons
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 074
    Par défaut
    Et si tu fais ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     data* pData = (data*)donnees;
    Nas'

  3. #3
    Membre éclairé Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Par défaut
    Citation Envoyé par Nasky
    Et si tu fais ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     data* pData = (data*)donnees;
    Nas'
    Non ça ne change rien

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    Ca risquera encore plus de bugguer comme ça (Les conversions explicites de pointeurs sont déconseillées en C quand on a des void * qui font ça très bien)

    PS: Pourquoi tu appelles ta structure "pData" dans ton main ? Si c'est ainsi que tu nommes tes pointeurs, ça mènera à la confusion : dans le main, ce n'est pas un pointeur...
    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.

  5. #5
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Ton pData, comment est-il intialisé exactement ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    nt main(int argc, char* argv[])
    {
       /* Declaration des variables */
     
       data pData; //  <== à cet endroit il y a n 'importe quoi dedans.
     
       /*Connection du signal click de chaque bouton à la fonction appropriée*/    g_signal_connect(G_OBJECT(pData.pBtConnect),"clicked",G_CALLBACK(connection),&pData);
       /* ... */
       return 0;
    }
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  6. #6
    Membre éclairé Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Par défaut
    Citation Envoyé par Médinoc
    Ca risquera encore plus de bugguer comme ça (Les conversions explicites de pointeurs sont déconseillées en C quand on a des void * qui font ça très bien)

    PS: Pourquoi tu appelles ta structure "pData" dans ton main ? Si c'est ainsi que tu nommes tes pointeurs, ça mènera à la confusion : dans le main, ce n'est pas un pointeur...
    Oui exacte le "p" est à retirer, c'est un oubli car au debut c'etait un pointeur

  7. #7
    Membre éclairé Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Par défaut
    Citation Envoyé par Trap D
    Ton pData, comment est-il intialisé exactement ?
    Ce n'est pas un pointeur.
    Voila ce qu'il y a dedans :
    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
    /* Creation fenetre */
    	creerFenetre(&pData.pFenetre,"MessInst",400,400);
    	g_signal_connect(G_OBJECT(pData.pFenetre), "destroy", G_CALLBACK(gtk_main_quit), NULL);
    	/* Ajout de la table dans la fenetre */
    	gtk_container_add(GTK_CONTAINER(pData.pFenetre),GTK_WIDGET(pTable));
    	/* Creations et ajouts des labels */
    	creerAjouterLabel(&pData.pLbIp,"Entrez IP du serveur",pTable,0,1,0,1);
    	creerAjouterLabel(&pData.pLbPort,"Entrez le port du serveur",pTable,0,1,2,3);
    	creerAjouterLabel(&pData.pLbLogin,"Entrez votre login",pTable,1,2,0,1);
    	creerAjouterLabel(&pData.pLbMdp,"Entrez votre mot de passe",pTable,1,2,2,3);
    	creerAjouterLabel(&pData.pLbDest,"Entrez le destinataire",pTable,1,2,4,5);
    	creerAjouterLabel(&pData.pLbMsg,"Entrez votre message",pTable,2,3,0,1);
    	/* Creations et ajouts des zones de saisie */
    	creerAjouterZoneSaisie(&pData.pZsIp,IP_SIZE_MAX,pTable,0,1,1,2);
    	creerAjouterZoneSaisie(&pData.pZsPort,PORT_SIZE_MAX,pTable,0,1,3,4);
    	creerAjouterZoneSaisie(&pData.pZsLogin,LOGIN_SIZE_MAX,pTable,1,2,1,2);
    	creerAjouterZoneSaisie(&pData.pZsMdp,MDP_SIZE_MAX,pTable,1,2,3,4);
    	creerAjouterZoneSaisie(&pData.pZsDest,LOGIN_SIZE_MAX,pTable,1,2,5,6);
    	creerAjouterZoneSaisie(&pData.pZsMsg,MSG_SIZE_MAX,pTable,2,3,1,2);
    	/* Creations et ajouts des boutons */
    	creerAjouterBouton(&pData.pBtConnect,"Se connecter",pTable,0,1,4,5);
    	creerAjouterBouton(&pData.pBtQuit,"Quitter",pTable,0,1,5,6);
    	creerAjouterBouton(&pData.pBtSend,"Envoyer",pTable,2,3,2,3);
    	/* Creation et ajout de la zone de texte */
    	creerAjouterZoneText(&pData.pZtInfos,pTable,2,3,3,6);
    creerAjouterLabel.c (le code pour les boutons, zones de saisie est quasiment identique) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    /* Fonction qui crée et ajoute un label dans une table*/
    void creerAjouterLabel(GtkWidget** pLabel, const char* texte,GtkWidget *pTable,guint left, guint right, guint top, guint bottom)
    {
    	*pLabel = gtk_label_new(texte); /*création du label*/
    	gtk_table_attach_defaults(GTK_TABLE(pTable),*pLabel,left,right,top,bottom);	/* Ajout dans la table */
    }

  8. #8
    Membre émérite
    Profil pro
    Eleveur de cornichons
    Inscrit en
    Juin 2002
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Eleveur de cornichons
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 074
    Par défaut
    Y'a un truc qui m'étonne avec le prototype de ta fonction connection qui est une callback.
    Ce n'est pas supposé être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void connection(GtkWidget *p, gpointer donnees);
    A moins que ce ne soit pas obligatoire...
    Mais en tout cas, si c'était ça, ça aurait été détecté à la compilation.

    Je vois pas ton erreur... j'ai très souvent fait comme ça...

    Nas'

  9. #9
    Membre éclairé Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Par défaut
    Citation Envoyé par Nasky
    Y'a un truc qui m'étonne avec le prototype de ta fonction connection qui est une callback.
    Ce n'est pas supposé être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void connection(GtkWidget *p, gpointer donnees);
    A moins que ce ne soit pas obligatoire...
    Mais en tout cas, si c'était ça, ça aurait été détecté à la compilation.

    Je vois pas ton erreur... j'ai très souvent fait comme ça...

    Nas'
    Oui c'est en effet le prototype type, mais comme je n'utilise pas le widget qui subit l'événement, je m'en passe dans le prototype.

    J'ai aussi souvent fait comme ça, c'est pour ça que moi aussi je ne trouve pas l'erreur

  10. #10
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    Eh bien, ne cherche plus ton erreur: Tu reçois le gtkwidget * à la place des données: Il faut que tu le mettes quand même!
    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.

  11. #11
    Membre éclairé Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Par défaut
    Citation Envoyé par Médinoc
    Eh bien, ne cherche plus ton erreur: Tu reçois le gtkwidget * à la place des données: Il faut que tu le mettes quand même!
    Ah ok.
    Mais bon le fait que je n'utilise pas le widget par la suite dans la fonction me donne un warning traité en erreur vu que je compile avec l'option -Werror

    Edit : c'etait bien ça l'erreur, comme quoi il ne fait jamais faire de zèle dans les prototypes !

  12. #12
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    void connection(GtkWidget *p, gpointer donnees)
    {
    (void)p;
    //blablabla
    }
    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.

  13. #13
    Membre éclairé Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Par défaut
    Citation Envoyé par Médinoc
    void connection(GtkWidget *p, gpointer donnees)
    {
    (void)p;
    //blablabla
    }
    Ok

    Merci pour ton aide

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

Discussions similaires

  1. Segmentation Fault incomprehensible
    Par StingerBell dans le forum C++
    Réponses: 12
    Dernier message: 08/12/2014, 20h23
  2. [SDL_Image] Img_Load : segmentation fault ....
    Par Mathieu.J dans le forum OpenGL
    Réponses: 6
    Dernier message: 19/10/2004, 23h52
  3. [REDHAT] Segmentation fault systematique
    Par mela dans le forum RedHat / CentOS / Fedora
    Réponses: 2
    Dernier message: 21/09/2004, 06h05
  4. Réponses: 13
    Dernier message: 13/07/2004, 15h41
  5. Comment contrer la "segmentation fault" ?
    Par guillaume_pfr dans le forum C
    Réponses: 15
    Dernier message: 08/08/2003, 13h43

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