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
Configuration: Linux
Firefox 3.0.8