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

GTK+ avec C & C++ Discussion :

Probleme de segmentation lors de la recuperation de données saisies


Sujet :

GTK+ avec C & C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2014
    Messages : 5
    Par défaut Probleme de segmentation lors de la recuperation de données saisies
    Salut à Tous,

    Je débute sur GTK et je suis le cours disponible sur le site developpez.net.
    Je souhaiterai récupérer le texte que utilisateur rentre dans les deux champs mais j'ai un problème de segmentation lors du lancement de mon programme. J'ai essayé de comprendre d’où viens le problème mais je n'arrive pas à le trouver. Voici mon code :
    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
    #include <gtk/gtk.h>
    void activation_recup(GtkWidget *Entre, gpointer data) {
    	const gchar *sText;
     
    	/* Recuperation du texte contenu dans le GtkEntry */
    	sText = gtk_entry_get_text(GTK_ENTRY(Entre));
    	printf("fct %s", sText);
    	/* Modification du texte contenu dans le GtkLabel */
    	gtk_label_set_text(GTK_LABEL((GtkWidget *) data), sText);
     
     
    }
     
    void recup_donnee(GtkWidget *pButton, gpointer data) {
    	GtkWidget *pTempEntry;
    	GtkWidget *pTempLabel;
    	GList *pList;
    	const gchar *sText;
     
    	/* Recuperation de la liste des elements que contient la GtkVBox */
    	pList = gtk_container_get_children(GTK_CONTAINER((GtkWidget *) data));
     
    	/* Le premier element est le GtkEntry */
    	pTempEntry = GTK_WIDGET(pList->data);
     
    	/* Passage a l element suivant : le GtkButton */
    	pList = g_list_next(pList);
     
    	/* Passage a l element suivant : le GtkLabel */
    	pList = g_list_next(pList);
     
    	/* Cet element est le GtkLabel */
    	pTempLabel = GTK_WIDGET(pList->data);
     
    	/* Recuperation du texte contenu dans le GtkEntry */
    	sText = gtk_entry_get_text(GTK_ENTRY(pTempEntry));
     
    	/* Modification du texte contenu dans le GtkLabel */
    	gtk_label_set_text(GTK_LABEL(pTempLabel), sText);
    	printf("fct 2 %s", sText);
     
    	/* Liberation de la memoire utilisee par la liste */
    	g_list_free(pList);
    }
     
     
    int main(int argc, char **argv) {
    	GtkWidget *fenetre_login;
    	GtkWidget *tableau_de_login;
    	GtkWidget *Entre_login;
    	GtkWidget *validation;
    	GtkWidget *login;
    	GtkWidget *Entre_mdp;
    	GtkWidget *mdp;
    	GtkWidget *label;
     
    	const gchar *sText;
     
    	gtk_init(&argc, &argv);
     
    	//fenetre login
    	fenetre_login = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    	gtk_window_set_title(GTK_WINDOW(fenetre_login), "Login");
    	gtk_window_set_position(GTK_WINDOW(fenetre_login), GTK_WIN_POS_CENTER);
    	gtk_window_set_default_size(GTK_WINDOW(fenetre_login), 320, 200);
     
     
    	tableau_de_login = gtk_table_new(5, 2, FALSE);
     
    	gtk_container_add(GTK_CONTAINER(fenetre_login), GTK_WIDGET(tableau_de_login));
     
    	login = gtk_label_new("Entrez votre login :");
     
    	mdp = gtk_label_new("Entrez votre mot de passe :");
     
    	Entre_login = gtk_entry_new();
     
    	Entre_mdp = gtk_entry_new();
     
    	validation = gtk_button_new_with_label("connexion");
     
    	gtk_table_attach(GTK_TABLE(tableau_de_login), login,
    					 0, 1, 0, 1,
    					 GTK_EXPAND, GTK_EXPAND,
    					 15, 0);
    	gtk_table_attach(GTK_TABLE(tableau_de_login), Entre_login,
    					 0, 2, 1, 2,
    					 GTK_EXPAND | GTK_FILL, GTK_EXPAND,
    					 15, 0);
    	gtk_table_attach(GTK_TABLE(tableau_de_login), mdp,
    					 0, 1, 2, 3,
    					 GTK_SHRINK, GTK_EXPAND,
    					 15, 0);
    	//gtk_table_attach_defaults(GTK_TABLE(tableau_de_login),mdp,0,1,2,3);
    	gtk_table_attach(GTK_TABLE(tableau_de_login), Entre_mdp,
    					 0, 2, 3, 4,
    					 GTK_EXPAND | GTK_FILL, GTK_EXPAND,
    					 15, 0);
    	gtk_table_attach(GTK_TABLE(tableau_de_login), validation,
    					 1, 2, 4, 5,
    					 GTK_EXPAND, GTK_EXPAND,
    					 0, 0);
    	gtk_table_attach(GTK_TABLE(tableau_de_login), label,
    					 0,1, 4, 5,
    					 GTK_EXPAND, GTK_EXPAND,
    					 0, 0);
     
     
    	g_signal_connect(G_OBJECT(Entre_login), "activate", G_CALLBACK(activation_recup), label);
     
    	g_signal_connect(G_OBJECT(validation), "clicked", G_CALLBACK(recup_donnee), tableau_de_login);
     
    	g_signal_connect(G_OBJECT(validation), "clicked", G_CALLBACK(gtk_main_quit), NULL);
     
    	//sText=gtk_label_get_text(GTK_LABEL(label));
    	printf("rrr%s", sText);
     
    	gtk_widget_show_all(fenetre_login);
     
     
    	gtk_main();
     
    	return 0;
    Si vous avez une idée, ça serait super cool

    Merci d'avance.

  2. #2
    Membre éclairé
    Profil pro
    Retraité
    Inscrit en
    Novembre 2009
    Messages
    331
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2009
    Messages : 331
    Par défaut
    En compilant avec l'option -Wall (recommandée), le compilateur indique
    warning: 'label' is used uninitialized in this function
    warning: 'sText' is used uninitialized in this function
    label n'est pas définie et sText est définie dans recup_donnee mais imprimée dans main()

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2014
    Messages : 5
    Par défaut
    Effectivement c'était ça, merci mais en fait je souhaiterai récupérer sous forme de chaîne de caractère ce que l'utilisateur rentre dans les champs mais je n'y arrive pas, pourriez vous m'expliquer comment faire ?

  4. #4
    Membre éclairé
    Profil pro
    Retraité
    Inscrit en
    Novembre 2009
    Messages
    331
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2009
    Messages : 331
    Par défaut
    Plutôt que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    /* Recuperation de la liste des elements que contient la GtkVBox */
    pList = gtk_container_get_children(GTK_CONTAINER((GtkWidget *) data));
    qui dépend de la structure précise de l'arbre des widgets utilisés, et donc est une source de problèmes, il est préférable de créer une structure contenant les pointeurs sur les widgets dont vous avez besoin dans recup_donnee() et de passer un pointeur sur cette structure au moyen de l'argument data.
    Ceci évitera d'avoir recours à une GList et sera beaucoup plus robuste si vous modifiez votre fenêtre de login.

  5. #5
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    1 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 395
    Par défaut
    Voilà le code modifié comme l'a conseillé, à juste titre, pvincent.
    J'ai retiré ce qui me semblait superflu. Notamment je ne vois pas trop à quel endroit tu essaies de récupérer la valeur des champs ni où tu veux l'utiliser.

    Je te conseille aussi de te mettre à GTK 3, GTK 2 a fait son temps, GTK 4 pointe déjà le bout de son nez, et le tutoriel sur développez date de mathusalem (10 ans).
    Par exemple, GtkTable a été rendu obsolète dans GTK 3 par GtkGrid. Il n'existera plus dans GTK 4.

    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
    #include <gtk/gtk.h>
    #include <string.h>  /* pour memset */
     
    typedef struct 
    {
    	GtkWidget *fenetre_login;
    	GtkWidget *tableau_de_login;
    	GtkWidget *Entre_login;
    	GtkWidget *validation;
    	GtkWidget *login;
    	GtkWidget *Entre_mdp;
    	GtkWidget *mdp;
    	GtkWidget *label;
    } Gui;
     
    void recup_donnee(GtkWidget *pButton, gpointer data) {
            Gui *gui = data;
    	const gchar *sText;
     
    	/* Recuperation du texte contenu dans le GtkEntry */
    	sText = gtk_entry_get_text(GTK_ENTRY(gui->Entre_login));
     
    	/* Modification du texte contenu dans le GtkLabel */
    	gtk_label_set_text(GTK_LABEL(gui->label), sText);
    	printf("fct %s", sText);
    }
     
     
    int main(int argc, char **argv) {
     
            Gui gui;
            memset(&gui, 0, sizeof(gui));
     
    	gtk_init(&argc, &argv);
     
    	//fenetre login
    	gui.fenetre_login = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    	gtk_window_set_title(GTK_WINDOW(gui.fenetre_login), "Login");
    	gtk_window_set_position(GTK_WINDOW(gui.fenetre_login), GTK_WIN_POS_CENTER);
    	gtk_window_set_default_size(GTK_WINDOW(gui.fenetre_login), 320, 200);
     
    	gui.tableau_de_login = gtk_table_new(5, 2, FALSE);
    	gui.login = gtk_label_new("Entrez votre login :");
    	gui.mdp = gtk_label_new("Entrez votre mot de passe :");
    	gui.Entre_login = gtk_entry_new();
    	gui.Entre_mdp = gtk_entry_new();
    	gui.validation = gtk_button_new_with_label("connexion");
            gui.label = gtk_label_new("label");
     
    	gtk_container_add(GTK_CONTAINER(gui.fenetre_login), GTK_WIDGET(gui.tableau_de_login));
    	gtk_table_attach(GTK_TABLE(gui.tableau_de_login), gui.login,
    					 0, 1, 0, 1,
    					 GTK_EXPAND, GTK_EXPAND,
    					 15, 0);
    	gtk_table_attach(GTK_TABLE(gui.tableau_de_login), gui.Entre_login,
    					 0, 2, 1, 2,
    					 GTK_EXPAND | GTK_FILL, GTK_EXPAND,
    					 15, 0);
    	gtk_table_attach(GTK_TABLE(gui.tableau_de_login), gui.mdp,
    					 0, 1, 2, 3,
    					 GTK_SHRINK, GTK_EXPAND,
    					 15, 0);
    	//gtk_table_attach_defaults(GTK_TABLE(tableau_de_login),mdp,0,1,2,3);
    	gtk_table_attach(GTK_TABLE(gui.tableau_de_login), gui.Entre_mdp,
    					 0, 2, 3, 4,
    					 GTK_EXPAND | GTK_FILL, GTK_EXPAND,
    					 15, 0);
    	gtk_table_attach(GTK_TABLE(gui.tableau_de_login), gui.validation,
    					 1, 2, 4, 5,
    					 GTK_EXPAND, GTK_EXPAND,
    					 0, 0);
    	gtk_table_attach(GTK_TABLE(gui.tableau_de_login), gui.label,
    					 0,1, 4, 5,
    					 GTK_EXPAND, GTK_EXPAND,
    					 0, 0);
     
     
            /* Connexion des signaux */
    	g_signal_connect(G_OBJECT(gui.validation), "clicked", G_CALLBACK(recup_donnee), &gui);
    	g_signal_connect(G_OBJECT(gui.validation), "clicked", G_CALLBACK(gtk_main_quit), NULL);
     
    	gtk_widget_show_all(gui.fenetre_login);
    	gtk_main();
     
    	return 0;
    }

  6. #6
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2014
    Messages : 5
    Par défaut
    Merci pour vos réponses, comme conseillé je suis passé sous GTK 3 et j'ai modifié un peu le programme mais une problème subsiste.
    En effet, cette fenêtre doit me permettre de récupérer les identifiants de l'utilisateur afin de comparer le login à 3 fichiers différents et de vérifier le mot de passe dans la foulé.
    Mais lorsque je tente de comparer le mot de passe avec une chaîne de caractère le mot de passe semble erroné, je ne comprend pas d'où viens l'erreur.
    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
    #include <stdlib.h>
    #include <gtk/gtk.h>
    #include <string.h>  /* pour memset */
     
    typedef struct
    {
    	GtkWidget *fenetre_login;
    	GtkWidget *boite_verticale;
    	GtkWidget *boite_H[3];
    	GtkWidget *validation;
    	GtkWidget *Entre_login;
    	GtkWidget *login;
    	GtkWidget *Entre_mdp;
    	GtkWidget *mdp;
    } Gui;
     
    typedef struct
    {
    	const gchar *login;
    	const gchar *mdp;
    } ID;
     
    void recup_donnee(GtkWidget *Bouton, gpointer data) {
    	Gui *gui = data;
    	ID id;
    	const gchar * test;
    	test = "123"; //valeur du mdp à verifier
     
    	/* Recuperation des indentifiants contenus dans les champs */
    	id.login = gtk_entry_get_text(GTK_ENTRY(gui->Entre_login));
     
    	id.mdp = gtk_entry_get_text(GTK_ENTRY(gui->Entre_mdp));
     
    	/* test du mot de passe*/
    	if (id.mdp == test )
    		printf("mdp est bon le login = %s", id.login);
    	else
    		printf("le mdp n'est pas bon et vaut = %s", id.mdp);
    }
     
    int main(int argc, char **argv)
    {
    	Gui gui ;
    	memset(&gui, 0, sizeof(gui));
     
    	gtk_init(&argc,&argv);
    	/*creation de la fenetre*/
    	gui.fenetre_login = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    	gtk_window_set_position(GTK_WINDOW(gui.fenetre_login), GTK_WIN_POS_CENTER);
    	gtk_window_set_title(GTK_WINDOW(gui.fenetre_login), "Login");
    	gtk_window_set_default_size(GTK_WINDOW(gui.fenetre_login), 320, 200);
     
     
    	/* Création de l'interieur de la fenetre */
    	gui.boite_verticale = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
    	gui.boite_H[0] = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
    	gui.boite_H[1] = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
    	gui.boite_H[2] = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
     
    	/* Ajout de la boite dans la fenetre */
    	gtk_container_add(GTK_CONTAINER(gui.fenetre_login), gui.boite_verticale);
     
    	/* Creation des boutons */
    	gui.validation = gtk_button_new_with_label(" valider ");
     
    	/* creation du texte contenu dans la fenetre*/
    	gui.login = gtk_label_new("Entrez votre login :");
    	gui.mdp = gtk_label_new("Entrez votre mot de passe :");
     
    	/* creation des entrees de texte*/
    	gui.Entre_login = gtk_entry_new();
    	gtk_entry_set_max_length(GTK_ENTRY(gui.Entre_login),22);
    	gui.Entre_mdp = gtk_entry_new();
    	gtk_entry_set_max_length(GTK_ENTRY(gui.Entre_login),20);
    	gtk_entry_set_visibility(GTK_ENTRY(gui.Entre_mdp), FALSE);
    	gtk_entry_set_invisible_char(GTK_ENTRY(gui.Entre_mdp), '*');
     
    	gtk_box_pack_start(GTK_BOX(gui.boite_verticale), gui.boite_H[0], TRUE, FALSE, 0);
     
    	/* Ajout de texte dans la boite */
    	gtk_box_pack_start(GTK_BOX(gui.boite_H[0]), gui.login, FALSE, FALSE, 10);
     
    	/* Ajout d'une entree dans la boite */
    	gtk_box_pack_start(GTK_BOX(gui.boite_verticale), gui.Entre_login, TRUE, FALSE, 0);
     
    	gtk_box_pack_start(GTK_BOX(gui.boite_verticale), gui.boite_H[1], TRUE, TRUE, 0);
     
    	/* Ajout de texte dans la boite */
    	gtk_box_pack_start(GTK_BOX(gui.boite_H[1]), gui.mdp, FALSE, FALSE, 10);
     
    	/* Ajout d'une entree dans la boite */
    	gtk_box_pack_start(GTK_BOX(gui.boite_verticale), gui.Entre_mdp, TRUE, FALSE, 0);
     
    	gtk_box_pack_start(GTK_BOX(gui.boite_verticale), gui.boite_H[2], TRUE, TRUE, 10);
     
    	/* Ajout du Bouton valider dans la boite */
    	gtk_box_pack_end(GTK_BOX(gui.boite_H[2]), gui.validation, FALSE, FALSE, 10);
     
    	/* Connexion des signaux */
    	g_signal_connect(G_OBJECT(gui.validation), "clicked", G_CALLBACK(recup_donnee), &gui);
    	g_signal_connect(G_OBJECT(gui.validation), "clicked", G_CALLBACK(gtk_main_quit), NULL);
     
    	gtk_widget_show_all(gui.fenetre_login);
     
    	gtk_main();
     
    	return EXIT_SUCCESS;
    }

Discussions similaires

  1. Réponses: 2
    Dernier message: 14/07/2016, 17h32
  2. Réponses: 4
    Dernier message: 24/11/2012, 23h22
  3. Probleme de decimal lors d'un transfere de données entre sqlserver et ase
    Par pb_inge dans le forum Développement de jobs
    Réponses: 6
    Dernier message: 26/10/2011, 17h12
  4. Probleme de MAJ lors de la suppression de donnée
    Par Tigre_82 dans le forum VB.NET
    Réponses: 6
    Dernier message: 03/09/2007, 17h12
  5. Recuperer les données saisie dans un formulaire
    Par hunzi dans le forum XMLRAD
    Réponses: 3
    Dernier message: 29/08/2006, 15h22

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