Probleme avec GTk (segmentation)
Résolu
@mourad
Messages postés
5
Date d'inscription
Statut
Membre
Dernière intervention
-
degolass -
degolass -
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
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
A voir également:
- Probleme avec GTk (segmentation)
- Gtk for net - Forum Programmation
- Erreur de segmentation (core dumped) ✓ - Forum Programmation
- Erreur de segmentation c ✓ - Forum C
- Erreur de segmentation ✓ - Forum Programmation
- Erreur segmentation fault (core dumped) - Forum C
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.
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.
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
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
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.
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.
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.
merci une autre fois et bonne nuit à toi aussi.
j'ai fais ce que tu m'as dis et j'ai initialisé le pointeur mais l'erreur apparait toujours.
merci encore une fois.
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'.