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++

  1. #1
    Candidat au Club
    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
    Points : 2
    Points
    2
    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 confirmé
    Profil pro
    Retraité
    Inscrit en
    Novembre 2009
    Messages
    329
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2009
    Messages : 329
    Points : 606
    Points
    606
    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()
    GraceGTK: a plotting tool at https://sourceforge.net/projects/gracegtk

  3. #3
    Candidat au Club
    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
    Points : 2
    Points
    2
    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 confirmé
    Profil pro
    Retraité
    Inscrit en
    Novembre 2009
    Messages
    329
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2009
    Messages : 329
    Points : 606
    Points
    606
    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.
    GraceGTK: a plotting tool at https://sourceforge.net/projects/gracegtk

  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
    Points : 2 002
    Points
    2 002
    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;
    }
    Documentation officielle GTK+ 3:
    GTK en C, GTK en Python

    Tutoriels GTK+ 3:
    GTK en C, GTK en Python

    Tutoriels par l'exemple (platform-demos):
    GTK (tous langages)

  6. #6
    Candidat au Club
    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
    Points : 2
    Points
    2
    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;
    }

  7. #7
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 291
    Points : 4 941
    Points
    4 941
    Billets dans le blog
    5
    Par défaut
    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);
    C'est une erreur classique. Intellectuellement tu as raison, mais un ordinateur ne fonctionne pas (encore !) comme un être humain.

    Ce que tu lui demandes ici c'est de comparer le contenu de l'adresse pointée par id.mp avec l'adresse de test. Quand je dis adresse, je sous-entends la première lettre de chaque chaîne de caractères.

    Pour comparer une chaîne avec une autre il te faut comparer lettre à lettre. Comme c'est fastidieux et qu'on utilise tout le temps ce genre de comparaison il existe une fonction toute faite pour ca :

    strcmp

    Il existe son pendant avec la Glib :

    g_strcmp0

  8. #8
    Candidat au Club
    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
    Points : 2
    Points
    2
    Par défaut
    Exact merci,
    mais j'ai encore une question:
    je souhaiterai que cette fenêtre s'affiche tant que le login ou le mot de passe ne sont pas bon et qu'une fois qu'ils sont bon fermer cette fenêtre pour en ouvrir une autre.
    Je partirai bien sur un DO WHILE mais je ne sais pas quoi mettre dans le WHILE dans la mesure ou la fonction "recup_donnee" ne retourne rien.
    je vous remet le code mis à jour :
    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
    #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;
    	char  mdp[20] = "123"; //valeur du mdp à verifier
    	char login[22] = "abc"; //valeur du login à 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 de l'existance du login*/
    	if (g_strcmp0(id.login,login)==0){
    		printf("Le login est bon");
    		/* test du mot de passe*/
    		if (g_strcmp0(id.mdp,mdp)==0 ) {
    			printf("mdp est bon le login = %s", id.login);
     
    		}
    		else
    			printf("le mdp n'est pas bon et vaut = %s", id.mdp);
    	} else
    		printf("Le login n'est pas bon");
    }
     
     
    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);
     
     
    	gtk_widget_show_all(gui.fenetre_login);
     
    	gtk_main();
     
    	return EXIT_SUCCESS;
    }

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 147
    Points : 88
    Points
    88
    Par défaut
    Bonjour,
    il existe plusieurs solution à ton problème. La première qui me vient à l'esprit est justement de faire retourner un drapeau à la fonction recup

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    flag = FALSE;
     
    while (recup_donnee(blabla) == FALSE)
    {
    }
    autre piste

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while ((g_strcmp0(id.mdp,mdp) !=0 ) 
    {
         printf("le mdp n'est pas bon et vaut = %s", id.mdp);
         ......
    }

    enfin un article d'apprentissage GLMF 194 introduisait un petit programme de demo sur justement l'authentification. Une très forte suggestion de s'inspirer de cette structure de programme
    https://github.com/GLMF/GLMF194/blob...entification.c
    a defaut de l'article le code à éplucher. Au bout de 3 nuits blanches tu sauras que faire pour ton code.
    récupère le code teste le , triture le analyse le et à la fin tu sauras ......

  10. #10
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 291
    Points : 4 941
    Points
    4 941
    Billets dans le blog
    5
    Par défaut
    Une autre solution possible.

    Rendre la fenêtre de log modale. C'est à dire par dessus la fenêtre principale.

    Lors de la validation des logs ne pas effacer la fenêtre. Vérifier si les logs sont bons.
    • Les logs sont bons : effacer la fenêtre et lancer le programme,
    • Les logs ne sont pas bons : effacer les logs inscrits.


    La fenêtre de log restant affichée l'utilisateur n'a pas d'autre choix que d'entrer les bons logs pour poursuivre.

  11. #11
    Candidat au Club
    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
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par gerald3d Voir le message
    Une autre solution possible.

    Rendre la fenêtre de log modale. C'est à dire par dessus la fenêtre principale.

    Lors de la validation des logs ne pas effacer la fenêtre. Vérifier si les logs sont bons.
    • Les logs sont bons : effacer la fenêtre et lancer le programme,
    • Les logs ne sont pas bons : effacer les logs inscrits.


    La fenêtre de log restant affichée l'utilisateur n'a pas d'autre choix que d'entrer les bons logs pour poursuivre.
    C'est pile ce que je souhaite faire mais derrière selon la personne qui se connecte la fenêtre sera différente, en effet j'ai 4 cas différents à gérer. Car tout les opérateurs n'ont pas accès à la même chose. En fait j'ai un fichier par type de personne et dès que l'utilisateur va entrer son login le programme va chercher dans un fichier puis un autres jusqu’à trouver le login ou en déduire une erreur d'identifiant. A ce moment la si le login ou le mot de passe est erroné, on ré-affiche la fenêtre login sinon on doit afficher la fenêtre correspondant au type d'utilisateur. Il me faudrait donc une fonction qui me renvoie le type de personne et avec un switch je pourrais m'en sortir à moins qu'il existe un autre moyen ...

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