Rechercher : dans
Par :

Probleme avec GTk (segmentation)

Dernière réponse le 20 avr 2009 à 00:32:38 @mourad, le 19 avr 2009 à 20:01:17 
 Signaler ce message aux modérateurs

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

Meilleures réponses pour « probleme avec GTk (segmentation) » dans :
[Langage C] C/C++ Erreur de segmentation Voir Qu'est ce qu'une erreur de segmentation Vous êtes en train de développer une application sous Linux en C/C++. Tout va bien, ça compile, les oiseaux chantent. Donc vous lancez votre application pour la tester. Et vous obtenez l'un de ces deux...
Votre première application graphique avec Python et Glade VoirCe guide vous aidera à créer pas à pas votre première application graphique. Nous allons utiliser le langage de programme Python et l'API graphique GTK, en utilisant le logiciel Glade pour créer facilement les interfaces graphiques. C'est de la...
Segmentation de la mémoire en assembleur VoirQu'est-ce que la segmentation de la mémoire ? En assembleur, on appelle segment de mémoire le mécanisme de base de la gestion des adresses pour des processeurs de type 80x86. Les instructions sont stockées dans le registre IP. Il s'agit d'adresses...

1

loupius, le 19 avr 2009 à 20:12:44

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.

Répondre à loupius

2

@mourad, le 19 avr 2009 à 23:21:30

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.

Répondre à @mourad

3

loupius, le 19 avr 2009 à 23:37:15

Qu'as-tu écrit pour l'initialiser ?

Répondre à loupius

4

@mourad, le 19 avr 2009 à 23:41:52

J'ai écris ident *id=NULL;

Répondre à @mourad

5

loupius, le 19 avr 2009 à 23:55:13

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'.

Répondre à loupius

6

@mourad, le 20 avr 2009 à 00:09:23

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

Répondre à @mourad

7

loupius, le 20 avr 2009 à 00:18:14

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.

Répondre à loupius

8

 @mourad, le 20 avr 2009 à 00:32:38

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.

Répondre à @mourad
Collection CommentÇaMarche.net