Probleme avec GTk (segmentation)

Résolu/Fermé
@mourad Messages postés 5 Date d'inscription jeudi 9 avril 2009 Statut Membre Dernière intervention 20 avril 2009 - 19 avril 2009 à 20:01
 degolass - 23 juil. 2010 à 15:46
Bonjour, j'ai un probleme que qui m'a pris une semaine en essayant de le resoudre mais en fin de compte j'ai pas réussi à le faire.donc j'ai décidé de le partager avec vous.
il est nécessaire de mentioné que j'ai fais pas mal de recherche dans google et tous ça mais j'ai pas trouvé de solution.
je veux faire une apllication de gestion de personnel (avec GTK) avec accés sécurisés.
j'ai écris un code valide syntaxiquement vu que le compilateur (code blocks) montione qu'il n'y a pas d'erreurs dans le code mais quand j'éxecute mon programme j'obtient une erreure de segmentation.(je sais que c'est une erreure liée à la mémoire) mais je n'arrive pas à corriger le probleme.
finalement je serais reconnaissant à toute personne qui pourrait m'aider.

le resultat du debugger est :

Program received signal SIGSEGV, Segmentation fault.
At /home/mourad/Bureau/C/GPersonnel/data.c:31

j'ai mentioné la ligne 31 dans le code ci-dessous.

voici mon code :

main.c

#include <stdlib.h>
#include <gtk/gtk.h>
#include <stdio.h>
#include <string.h>
#include "interface.h"
#include "data.h"

int main(int argc, char **argv)
{

/* Initialize GTK+ */
g_log_set_handler ("Gtk", G_LOG_LEVEL_WARNING, (GLogFunc) gtk_false, NULL);
gtk_init (&argc, &argv);
g_log_set_handler ("Gtk", G_LOG_LEVEL_WARNING, g_log_default_handler, NULL);

create_connectw();
gtk_main();

return EXIT_SUCCESS;
}


interface.c

#include <stdlib.h>
#include <gtk/gtk.h>
#include <stdio.h>
#include "interface.h"
#include "data.h"
//#include "other.h"

void create_connectw(void)
{

GtkWidget *vbox1;
GtkWidget *Connectimage;
GtkWidget *table1;
GtkWidget *Usernamelabel;
GtkWidget *Passwordlabel;
GtkWidget *Connectbutton;
GtkWidget *alignment1;
GtkWidget *hbox1;
GtkWidget *image2;
GtkWidget *label3;
GtkWidget *UsernameEntry;
GtkWidget *PasswordEntry;
GtkWidget *connectWindow;
GSList *liste=NULL;


connectWindow = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_title (GTK_WINDOW (connectWindow), "GPersonnel");
gtk_window_set_position (GTK_WINDOW (connectWindow), GTK_WIN_POS_CENTER);
gtk_window_set_resizable (GTK_WINDOW (connectWindow), FALSE);
gtk_window_set_icon_name (GTK_WINDOW (connectWindow), "gtk-dialog-authentication");

vbox1 = gtk_vbox_new (FALSE, 30);
gtk_container_add (GTK_CONTAINER (connectWindow), vbox1);

Connectimage = gtk_image_new_from_file("grh.bmp");
gtk_box_pack_start (GTK_BOX (vbox1), Connectimage, TRUE, TRUE, 0);
gtk_misc_set_alignment (GTK_MISC (Connectimage), 0.5, 0);

table1 = gtk_table_new (3, 2, FALSE);
gtk_box_pack_start (GTK_BOX (vbox1), table1, TRUE, TRUE, 0);
gtk_table_set_row_spacings (GTK_TABLE (table1), 17);

UsernameEntry = gtk_entry_new ();
gtk_table_attach (GTK_TABLE (table1), UsernameEntry, 1, 2, 0, 1,
(GtkAttachOptions) (GTK_EXPAND),
(GtkAttachOptions) (0), 0, 0);
gtk_entry_set_max_length (GTK_ENTRY (UsernameEntry), 20);

PasswordEntry = gtk_entry_new ();
gtk_table_attach (GTK_TABLE (table1), PasswordEntry, 1, 2, 1, 2,
(GtkAttachOptions) (GTK_EXPAND),
(GtkAttachOptions) (0), 0, 0);
gtk_entry_set_max_length (GTK_ENTRY (PasswordEntry), 10);
gtk_entry_set_visibility (GTK_ENTRY (PasswordEntry), FALSE);



Usernamelabel = gtk_label_new ("<b>Username :</b>");
gtk_table_attach (GTK_TABLE (table1), Usernamelabel, 0, 1, 0, 1,
(GtkAttachOptions) (GTK_FILL),
(GtkAttachOptions) (0), 14, 0);
gtk_label_set_use_markup (GTK_LABEL (Usernamelabel), TRUE);
gtk_misc_set_alignment (GTK_MISC (Usernamelabel), 0, 0.5);

Passwordlabel = gtk_label_new ("<b>Password :</b>");
gtk_table_attach (GTK_TABLE (table1), Passwordlabel, 0, 1, 1, 2,
(GtkAttachOptions) (GTK_FILL),
(GtkAttachOptions) (0), 14, 0);
gtk_label_set_use_markup (GTK_LABEL (Passwordlabel), TRUE);
gtk_misc_set_alignment (GTK_MISC (Passwordlabel), 0, 0.5);

Connectbutton = gtk_button_new ();
gtk_table_attach (GTK_TABLE (table1), Connectbutton, 0, 2, 2, 3,
(GtkAttachOptions) (0),
(GtkAttachOptions) (0), 14, 20);
gtk_button_set_relief (GTK_BUTTON (Connectbutton), GTK_RELIEF_NONE);

alignment1 = gtk_alignment_new (0.5, 0.5, 0, 0);
gtk_container_add (GTK_CONTAINER (Connectbutton), alignment1);

hbox1 = gtk_hbox_new (FALSE, 2);
gtk_container_add (GTK_CONTAINER (alignment1), hbox1);

image2 = gtk_image_new_from_stock ("gtk-apply", GTK_ICON_SIZE_BUTTON);
gtk_box_pack_start (GTK_BOX (hbox1), image2, FALSE, FALSE, 0);

label3 = gtk_label_new_with_mnemonic ("S'identifier");
gtk_box_pack_start (GTK_BOX (hbox1), label3, FALSE, FALSE, 0);

gtk_widget_show_all(connectWindow);

liste = g_slist_append(liste, (gpointer)connectWindow);
liste = g_slist_append(liste, (gpointer)UsernameEntry);
liste = g_slist_append(liste, (gpointer)PasswordEntry);


g_signal_connect(G_OBJECT(connectWindow), "destroy", G_CALLBACK(gtk_main_quit), NULL);
g_signal_connect(G_OBJECT(connectWindow), "delete_event", G_CALLBACK(gtk_main_quit), NULL);


//g_signal_connect(G_OBJECT(UsernameEntry), "activate", G_CALLBACK(recuperate_data), (gpointer)liste);
//g_signal_connect(G_OBJECT(PasswordEntry), "activate", G_CALLBACK(recuperate_data), (gpointer)liste);



g_signal_connect ((gpointer) Connectbutton, "clicked",G_CALLBACK (recuperate_data),(gpointer)liste);

}

void create_Errorload(GtkWidget *win)
{
GtkWidget *dialog = NULL;

dialog = gtk_message_dialog_new (GTK_WINDOW (win),
GTK_DIALOG_MODAL,
GTK_MESSAGE_ERROR,
GTK_BUTTONS_CLOSE,
"Erreur survenu lors du chargement du fichier des indentifiants.\nla suppression du fichier des identifiants est probablement la\ncause de cette erreure.le fichier sera cr\303©er automatiquement,\net dans ce cas pour acc\303©der \303  l'application vous devez entrer\nle login et le mot de passe par defaut.");
gtk_dialog_run (GTK_DIALOG (dialog));
gtk_widget_destroy (dialog);
}

void create_login_inco(GtkWidget *wind)
{
GtkWidget *dialog = NULL;

dialog = gtk_message_dialog_new (GTK_WINDOW (wind), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, "Login ou/et mot de passe incorrecte(s).");
gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_CENTER);
gtk_dialog_run (GTK_DIALOG (dialog));
gtk_widget_destroy (dialog);

}


data.c

#include <stdlib.h>
#include <gtk/gtk.h>
#include <stdio.h>
#include <string.h>
#include "interface.h"
#include "data.h"


void recuperate_data(GtkWidget *button, gpointer data)
{
FILE *fichier=NULL;
ident *id, *identifier;
GtkWidget *Username;
GtkWidget *Password;
GtkWidget *connectWindow;

connectWindow = (GtkWidget*)g_slist_nth_data((GSList*)data, 0);
Username = (GtkWidget*)g_slist_nth_data((GSList*)data, 1);
Password = (GtkWidget*)g_slist_nth_data((GSList*)data, 2);


fichier = fopen("pass.txt","rb");

if(fichier == NULL)
{
(id->login) = "GPersonnel"; // c'est la ligne 31 du fichier.
(id->pass) = "changeme";

create_Errorload(connectWindow);
fichier = fopen("pass.txt","wb");
fwrite(id, sizeof(ident), 1, fichier);
}

else
{
rewind(fichier);
fread(id,sizeof(ident),1,fichier);

(identifier->login) = gtk_entry_get_text(GTK_ENTRY(Username));
(identifier->pass) = gtk_entry_get_text(GTK_ENTRY(Password));

if(strcmp(id->login, (identifier->login))!=0 || strcmp(id->pass, (identifier->pass))!=0) create_login_inco(connectWindow);

}

}

interface.h

#ifndef INTERFACE_H_INCLUDED
#define INTERFACE_H_INCLUDED

void create_connectw(void);
void create_Errorload(GtkWidget *win);
void create_login_inco(GtkWidget *wind);


#endif // INTERFACE_H_INCLUDED


data.h

typedef struct ident
{
const gchar *login;
const gchar *pass;
} ident;

void recuperate_data(GtkWidget *button, gpointer data);

#endif // DATA_H_INCLUDED

4 réponses

Comme d'hab, la machine a toujours raison.
Comme toujours une erreur de segmentation est dûe dans au moins 99% des cas par une mauvaise utilisation d'un pointeur.
Il faut absolument se mettre en tête que l'utilisation d'un pointeur impose:
déclaration, initialisation, utilisation, libération, et dans l'ordre !
Si on ne veut pas respecter ceci, il faut changer de langage !
Ici, comme c'est indiqué, à la ligne 31 du fichier 'data.c', tu utilises le pointeur 'id' qui n'est pas initialisé, donc la sanction tombe immanquablement à un moment ou un autre !
Bon courage.
0
@mourad Messages postés 5 Date d'inscription jeudi 9 avril 2009 Statut Membre Dernière intervention 20 avril 2009
19 avril 2009 à 23:21
merci beaucoup pour ton soutient.
j'ai fais ce que tu m'as dis et j'ai initialisé le pointeur mais l'erreur apparait toujours.

merci encore une fois.
0
loupius > @mourad Messages postés 5 Date d'inscription jeudi 9 avril 2009 Statut Membre Dernière intervention 20 avril 2009
19 avril 2009 à 23:37
Qu'as-tu écrit pour l'initialiser ?
0
@mourad Messages postés 5 Date d'inscription jeudi 9 avril 2009 Statut Membre Dernière intervention 20 avril 2009 > loupius
19 avril 2009 à 23:41
j'ai écris ident *id=NULL;
0
loupius > @mourad Messages postés 5 Date d'inscription jeudi 9 avril 2009 Statut Membre Dernière intervention 20 avril 2009
19 avril 2009 à 23:55
Pas étonnant que ça plante toujours !!!
Initialiser un pointeur, c'est lui allouer de l'espace mémoire et cet espace mémoire doit être de taille adaptée à l'objet pointé, donc dans le cas présent de la taille de la structure 'ident'.
0
@mourad Messages postés 5 Date d'inscription jeudi 9 avril 2009 Statut Membre Dernière intervention 20 avril 2009
20 avril 2009 à 00:09
je sais pas vraiment quoi dire.

j'ai fais une allocation dynamique comme tu m'as dis et ça a marché.
merci beaucoup une autre fois.

je sais pas comment j'ai pas pensé à cette solution vraiment je suis ............... rien à dire

je crois que parceque j'utilise en général les pointeur des structures de la meme façon et ça marche.mais bon c'est une bonne leçon que tu viens de me donner.

merci beaucoup
0
je sais pas comment j'ai pas pensé à cette solution
Quand on utilise un pointeur, c'est la première chose à penser; oh certes, ça ne plante pas toujours, mais ça donne des programmes instables qui plantent apparemment sans raison, et on accuse le compilateur ou le système d'exploitation ou le PC, tout y passe... mais on a jamais l'humilité de se remettre en question.
Sur ce, bonne nuit.
0
@mourad Messages postés 5 Date d'inscription jeudi 9 avril 2009 Statut Membre Dernière intervention 20 avril 2009
20 avril 2009 à 00:32
oui c'est vrai t'as totalement raison j'ai meme accusé le systeme d'exploitation et je l'ai changé en passant de windows à ubuntu.

merci une autre fois et bonne nuit à toi aussi.
0
Problème un peu vieux, mais je viens de tomber dessus et il m'a aidé à résoudre mon problème qui était du même ordre (écriture dans un fichier txt).

Il est vrai que bien penser à allouer de la mémoire à son pointeur est important ... une bonne leçon pour moi aujourd'hui ... merci loupius. :-)
0