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 :

Passage de paramètre à une fonction dans un G_CALLBACK


Sujet :

GTK+ avec C & C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 103
    Points : 48
    Points
    48
    Par défaut Passage de paramètre à une fonction dans un G_CALLBACK
    Bonjour,

    J'ai fait un programme qui permet d'ajouter des membres(nom, prenom,...) dans un fichier. J'ai créé une GUI pour ajouter les membres dans mon fichier mais le probleme vient du fait que je n'arrive pas à faire passer les paramètres dans la fonction Ajouter qui est appeler par le G_CALLBACK. En effet, j'utilise un index qui est initialisé en début de programme et qui contient la position et le nom du membre. Donc, j'utilise cet index pour rechercher un emplacement vide et qui retourne le pointeur de la structure INDEX, ainsi je peus me déplacer dans le fichier grâce à fseek et à la valeur de ind->position pour ajouter le nouveau membre.
    J'ai donc besoin de faire passer comme paramètres dans ma fonction Ajouter, le pointeur de la structure INDEX et de la structure MEMBRE.
    Comment faire ?? (si on ne sait pas faire passer des paramètres comment peut on les récupérer)

    Merci

    A++

  2. #2
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    En fait tu passes les données pour la fonction dans le dernier argument de la macro
    #define g_signal_connect (instance, detailed_signal, c_handler, data)
    qui sert justement à cela ! Ce paramètre est retransmis dans l'argument gpointer data de ta fonction callback.

    Si maintenant tu dois passer plusieurs données, tu peux toujours créer une structure contenant toutes les informations dont tu as besoin, il te suffit ensuite de récupérer la structure dans ta fonction callback.

  3. #3
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Voici un exemple très instructif sur le passage d'une structure contenant plusieurs données: http://gtk.developpez.com/cours/gtk2....de.saisie.php

    Tu peux voir le passage de la structure dans le main dans les deux derniers enregistrements de callbacks:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
       /* Connexion du signal "activate" du GtkEntry */
        g_signal_connect(G_OBJECT(pApp->pEntry), "activate", G_CALLBACK(OnUpdate), (gpointer) pApp);
    ...
    et ici tu peux voir comment ils récupèrent la structure dans la fonction callback:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    /* Fonction callback execute lors du signal "activate" */
    void OnUpdate(GtkWidget *pEntry, gpointer data)
    {
        const gchar *sText;
        MainWindow *pApp;
     
        /* Recuperation de data */
        pApp = (MainWindow*) data;
    ...

    Voilà tout ce dont tu as besoin de savoir !

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 103
    Points : 48
    Points
    48
    Par défaut
    OK, donc en fait je dois créer une structure qui contient les pointeurs dont j'ai besoin dans ma fonction et ensuite la récupérer comme dans l'exemple.


    Merci

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 103
    Points : 48
    Points
    48
    Par défaut
    Salut,

    J'ai donc crée un structure avec les pointeurs dont j'avais besoin et je la récupère comme dans l'exemple ci-dessus et cela à l'air de marcher.
    Mais le problème vient du fait que ma recherche pour trouver un emplacement vide me retourne toujour la même valeur (0)

    Voici la fonction:
    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
    struct INDEX * Vide(struct WIDGET *ptgui, char *pt)
    {
    	int i;
    	bool trouve;
     
    	i = 0;
    	while(i<100 && trouve == false)
    	{
    		if(ptgui->ind->nom == pt)
    		{
    			trouve = true;
    		}
    		else
    		{
    			ptgui->ind++;
    			i++;
    		}
    	}
     
    	if(i == 100)
    	{
    		return(NULL);
    	}
    	else
    	{
    		return(ptgui->ind);
    	}
    }
    Appeler par celle-ci:
    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
    void Fichier(GtkWidget *widget, gpointer data)
    {
    	FILE *fp;
    	struct WIDGET *ptgui;
    	char *pt; 
     
    	ptgui = (WIDGET *) data;
    	pt = " ";
     
    	ptgui->ind = Vide(ptgui, pt);
     
    	printf("%d", ptgui->ind->position);
     
    	fp = fopen("Membre.dat", "r+b");
     
    	fseek(fp, (ptgui->ind->position) * sizeof(struct MEMBRE), SEEK_SET);
     
    	ptgui->mbr->numlicense = (char *)gtk_entry_get_text(GTK_ENTRY(ptgui->ptentry[0]));
     
    	fwrite(ptgui->mbr, sizeof(struct MEMBRE), 1, fp);
     
    	fclose(fp);
     
    	gtk_widget_destroy(ptgui->ptfenetre[1]);
     
    }
    Je ne comprend pas trop d'ou vient le problème, est-ce à cause de la structure, ...

    Autre question, la valeur retournée par le "gtk_entry_get_text" est de type const char, vaut-il mieux la récupérer dans un const char aussi ou alors je peus laisser comme ça avec un casting ??

    Je poste le code complet au cas ou:
    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
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    #include<gtk/gtk.h>
     
    struct MEMBRE { char *numlicense;
    				char *nom;
    				char *prenom;
    				char *date;
    };
     
    struct INDEX { int position;
    			   char *numlicense;
    			   char *nom;
    };
     
    struct WIDGET {	struct INDEX *ind;
    				struct MEMBRE *mbr;
    				GtkWidget *ptfenetre[2];
    				GtkWidget *ptframe;
    				GtkWidget *ptbox[2];
    				GtkWidget *ptframebox;
    				GtkWidget *ptlabel;
    				GtkWidget *ptbouton;
    				GtkWidget *ptentry[4];
    };
     
    void Bidonnage(struct MEMBRE *);
    void Init(struct INDEX *, struct MEMBRE *);
    struct INDEX * Vide(struct WIDGET *, char *);
    void Ajouter(GtkWidget *, gpointer);
    void Fichier(GtkWidget *, gpointer);
    void Destruct(GtkWidget *, gpointer);
     
    void main(int argc, char **argv)
    {
    	struct MEMBRE membre[100];
    	struct INDEX index[100];
     
    	struct WIDGET *ptgui;
     
    	ptgui = (WIDGET *)malloc(sizeof(struct WIDGET));;
     
    	ptgui->ind = &index[0];
    	ptgui->mbr = &membre[0];
     
    	gtk_init(&argc, &argv);
     
    	//Bidonnage(ptgui->mbr);
     
    	Init(ptgui->ind, ptgui->mbr);
     
    	ptgui->ind->nom  = "Dimitri";
     
    	ptgui->ptfenetre[0] = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    	gtk_window_set_position(GTK_WINDOW(ptgui->ptfenetre[0]), GTK_WIN_POS_CENTER);
    	gtk_window_set_default_size(GTK_WINDOW(ptgui->ptfenetre[0]), 320, 200);
    	gtk_window_set_title(GTK_WINDOW(ptgui->ptfenetre[0]), "DimSoft - Gestion");
     
    	ptgui->ptbox[0] = gtk_vbox_new(FALSE, NULL);
    	gtk_container_add(GTK_CONTAINER(ptgui->ptfenetre[0]), ptgui->ptbox[0]);
     
    	ptgui->ptbouton = gtk_button_new_with_label("Ajouter");
    	gtk_box_pack_start(GTK_BOX(ptgui->ptbox[0]), ptgui->ptbouton, FALSE, FALSE, 10);
     
    	g_signal_connect(G_OBJECT(ptgui->ptfenetre[0]), "destroy", G_CALLBACK(gtk_main_quit), NULL);
     
    	g_signal_connect(G_OBJECT(ptgui->ptbouton), "clicked", G_CALLBACK(Ajouter), (gpointer *) ptgui);
     
    	gtk_widget_show_all(ptgui->ptfenetre[0]);
     
    	gtk_main();
     
    	free(ptgui);
    }
     
    void Bidonnage(struct MEMBRE *mbr)
    {
    	FILE *fp;
    	int i;
     
    	fp = fopen("Membre.dat", "w+b");
     
    	mbr->numlicense = "-1";
    	mbr->nom = " ";
    	mbr->prenom = " ";
     
    	i = 0;
    	while(i < 100)
    	{
    		fwrite(mbr, sizeof(struct MEMBRE), 1, fp);
    		i++;
    	}
     
    	fclose(fp);
    }
     
    void Init(struct INDEX *ind, struct MEMBRE *mbr)
    {
    	FILE *fp;
    	int i;
     
    	fp = fopen("Membre.dat", "r+b");
     
    	fread(mbr, sizeof(struct MEMBRE), 100, fp);
     
    	for(i=0; i<100;i++)
    	{
    		(ind+i)->position = i;
    		(ind+i)->numlicense = (mbr+i)->numlicense;
    		(ind+i)->nom = (mbr+i)->nom;
    	}
     
    	fclose(fp);
    }
     
    void Ajouter(GtkWidget *widget, gpointer data)
    {
    	struct WIDGET *ptgui;
     
    	GtkWidget *ptbouton[2];
     
    	ptgui = (WIDGET *) data;
     
    	ptgui->ptfenetre[1] = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    	gtk_container_set_border_width(GTK_CONTAINER(ptgui->ptfenetre[1]), 5);
    	gtk_window_set_position(GTK_WINDOW(ptgui->ptfenetre[1]), GTK_WIN_POS_CENTER);
    	gtk_window_set_default_size(GTK_WINDOW(ptgui->ptfenetre[1]), 320, 200);
    	gtk_window_set_title(GTK_WINDOW(ptgui->ptfenetre[1]), "DimSoft - Ajout de membres");
     
    	ptgui->ptbox[1] = gtk_vbox_new(FALSE, NULL);
    	gtk_container_add(GTK_CONTAINER(ptgui->ptfenetre[1]), ptgui->ptbox[1]);
     
    	ptgui->ptframe = gtk_frame_new("Etat civil");
    	gtk_box_pack_start(GTK_BOX(ptgui->ptbox[1]), ptgui->ptframe, TRUE, FALSE, NULL);
     
    	ptgui->ptframebox = gtk_vbox_new(FALSE, NULL);
    	gtk_container_add(GTK_CONTAINER(ptgui->ptframe), ptgui->ptframebox);
     
    	ptgui->ptlabel = gtk_label_new("License : ");
    	gtk_box_pack_start(GTK_BOX(ptgui->ptframebox), ptgui->ptlabel, TRUE, FALSE, NULL);
    	ptgui->ptentry[0] = gtk_entry_new();
    	gtk_box_pack_start(GTK_BOX(ptgui->ptframebox), ptgui->ptentry[0], TRUE, FALSE, NULL);
     
    	ptgui->ptlabel = gtk_label_new("Nom : ");
    	gtk_box_pack_start(GTK_BOX(ptgui->ptframebox), ptgui->ptlabel, TRUE, FALSE, NULL);
    	ptgui->ptentry[1] = gtk_entry_new();
    	gtk_box_pack_start(GTK_BOX(ptgui->ptframebox), ptgui->ptentry[1], TRUE, FALSE, NULL);
     
    	ptgui->ptlabel = gtk_label_new("Prenom : ");
    	gtk_box_pack_start(GTK_BOX(ptgui->ptframebox), ptgui->ptlabel, TRUE, FALSE, NULL);
    	ptgui->ptentry[2] = gtk_entry_new();
    	gtk_box_pack_start(GTK_BOX(ptgui->ptframebox), ptgui->ptentry[2], TRUE, FALSE, NULL);
     
    	ptgui->ptlabel = gtk_label_new("Date de naissance : ");
    	gtk_box_pack_start(GTK_BOX(ptgui->ptframebox), ptgui->ptlabel, TRUE, FALSE, NULL);
    	ptgui->ptentry[3] = gtk_entry_new();
    	gtk_box_pack_start(GTK_BOX(ptgui->ptframebox), ptgui->ptentry[3], TRUE, FALSE, NULL);
     
    	ptbouton[0] = gtk_button_new_from_stock(GTK_STOCK_OK);
    	gtk_box_pack_start(GTK_BOX(ptgui->ptbox[1]), ptbouton[0], FALSE, FALSE, NULL);
     
    	ptbouton[1] = gtk_button_new_from_stock(GTK_STOCK_CANCEL);
    	gtk_box_pack_start(GTK_BOX(ptgui->ptbox[1]), ptbouton[1], FALSE, FALSE, NULL);
     
    	g_signal_connect(G_OBJECT(ptbouton[0]), "clicked", G_CALLBACK(Fichier), (gpointer *) ptgui);
     
    	g_signal_connect(G_OBJECT(ptbouton[1]), "clicked", G_CALLBACK(Destruct), (gpointer *) ptgui);
     
    	gtk_widget_show_all(ptgui->ptfenetre[1]);
    }
     
    struct INDEX * Vide(struct WIDGET *ptgui, char *pt)
    {
    	int i;
    	bool trouve;
     
    	i = 0;
    	while(i<100 && trouve == false)
    	{
    		if(ptgui->ind->nom == pt)
    		{
    			trouve = true;
    		}
    		else
    		{
    			ptgui->ind++;
    			i++;
    		}
    	}
     
    	if(i == 100)
    	{
    		return(NULL);
    	}
    	else
    	{
    		return(ptgui->ind);
    	}
    }
     
    void Fichier(GtkWidget *widget, gpointer data)
    {
    	FILE *fp;
    	struct WIDGET *ptgui;
    	char *pt; 
     
    	ptgui = (WIDGET *) data;
    	pt = " ";
     
    	ptgui->ind = Vide(ptgui, pt);
     
    	printf("%d", ptgui->ind->position);
     
    	fp = fopen("Membre.dat", "r+b");
     
    	fseek(fp, (ptgui->ind->position) * sizeof(struct MEMBRE), SEEK_SET);
     
    	ptgui->mbr->numlicense = (char *)gtk_entry_get_text(GTK_ENTRY(ptgui->ptentry[0]));
     
    	fwrite(ptgui->mbr, sizeof(struct MEMBRE), 1, fp);
     
    	fclose(fp);
     
    	gtk_widget_destroy(ptgui->ptfenetre[1]);
     
    }
     
    void Destruct(GtkWidget *widget, gpointer data)
    {
    	struct WIDGET *ptgui;
     
    	ptgui = (WIDGET *) data;
     
    	gtk_widget_destroy(ptgui->ptfenetre[1]);
    }
    Merci

  6. #6
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Bon je commence depuis le haut de code (y'a de quoi faire) :

    • Utilise un typedef sur tes structure, ca va alléger un peu ton code !
    • On initialise toujours GTK+ en premier, juste après la déclaration des tes variables et autre pointeurs et tableaux !
    • main retourne toujours un int !
    • Initialise toujours tes pointeurs au moins à NULL lors de leur déclaration !
    • Dans le malloc dans ton main, inutile de caster et voici une manière de faire qui est mieux adaptée à la maintenance du code:
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
       
      ptgui = g_malloc (sizeof (* ptgui));
      Prend également aussi l'habitude de toujours vérifier les retour de tes allocations pour savoir si elles se déroulent bien. Ici je t'ais mis la fonction d'allocation de la GLib !
    • En C (C89/C90) on utilise les commentaire sous la forme:
    • Relis bien la signature de gtk_vbox_new Toi tu as passé le second argument à NULL alors qu'il attend un gint, faut un peu faire attention à ce que tu fais !
    • Relis également la signature de gtk_box_pack_start. Encore une fois tu passes NULL à un argument qui attend un gint ! Tu as quelque chose contre les gint ?
    • Le type bool n'existe pas en C89/C90 mais la GLib propose un type gboolean, à utiliser alors dans le cas d'une utilisation de GLib ou GTK+ !
    • Vérifie également toujours l'ouverture de tes fichiers !


    Franchement, cela m'étonne plus que tout que tu ais réussi à compiler et exécuté sans problème ton code, ca fait presque 1heure que je bosse dessus et je suis loin d'avoir fini les corrections et autres amélioration et protection dans ton code ...

    Bon moi je n'ai pas pû faire les tests vu que j'ai uniquement ton code et pas ton fichier qui doit être ouvert et lu par le programme !


    Ton code complet un peu revu et corrigé mais y'a encore de quoi occuper un ptit moment:

    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
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    #include<gtk/gtk.h>
     
     
    typedef struct {
                char *numlicense;
    				char *nom;
    				char *prenom;
    				char *date;
    }
    MEMBRE;
     
    typedef struct {
                int position;
    			   char *numlicense;
    			   char *nom;
    }
    INDEX;
     
    typedef struct {
                INDEX *ind;
    				MEMBRE *mbr;
    				GtkWidget *ptfenetre[2];
    				GtkWidget *ptframe;
    				GtkWidget *ptbox[2];
    				GtkWidget *ptframebox;
    				GtkWidget *ptlabel;
    				GtkWidget *ptbouton;
    				GtkWidget *ptentry[4];
    }
    WIDGET;
     
     
    void Bidonnage(MEMBRE *);
    void Init(INDEX *, MEMBRE *);
    INDEX * Vide(WIDGET *, char *);
    void Ajouter(GtkWidget *, gpointer);
    void Fichier(GtkWidget *, gpointer);
    void Destruct(GtkWidget *, gpointer);
     
     
    int main(int argc, char **argv)
    {
    	WIDGET *ptgui = NULL;
     
     
    	gtk_init(&argc, &argv);
     
     
    	ptgui = g_malloc (sizeof (* ptgui));
     
       if (ptgui == NULL)
       {
          g_error ("Erreur d'allocation de la structure !\n");
          exit (EXIT_FAILURE);
       }
     
       memset (ptgui, 0, sizeof (* ptgui));
     
    	ptgui->ind = g_malloc (100 * sizeof (* ptgui->ind));
    	ptgui->mbr = g_malloc (100 * sizeof (* ptgui->mbr));
     
     
    	/* Bidonnage(ptgui->mbr); */
       printf ("...1\n");
    	Init(ptgui->ind, ptgui->mbr);
       printf ("...2\n");
     
       ptgui->ind->nom  = "Dimitri";
     
     
    	ptgui->ptfenetre[0] = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    	gtk_window_set_position(GTK_WINDOW(ptgui->ptfenetre[0]), GTK_WIN_POS_CENTER);
    	gtk_window_set_default_size(GTK_WINDOW(ptgui->ptfenetre[0]), 320, 200);
    	gtk_window_set_title(GTK_WINDOW(ptgui->ptfenetre[0]), "DimSoft - Gestion");
     
    	ptgui->ptbox[0] = gtk_vbox_new (FALSE, 0);
    	gtk_container_add(GTK_CONTAINER(ptgui->ptfenetre[0]), ptgui->ptbox[0]);
     
    	ptgui->ptbouton = gtk_button_new_with_label("Ajouter");
    	gtk_box_pack_start(GTK_BOX(ptgui->ptbox[0]), ptgui->ptbouton, FALSE, FALSE, 10);
     
    	g_signal_connect(G_OBJECT(ptgui->ptfenetre[0]), "destroy", G_CALLBACK(gtk_main_quit), NULL);
     
    	g_signal_connect(G_OBJECT(ptgui->ptbouton), "clicked", G_CALLBACK(Ajouter), (gpointer *) ptgui);
     
    	gtk_widget_show_all(ptgui->ptfenetre[0]);
     
    	gtk_main();
     
    	free(ptgui);
     
     
       return EXIT_SUCCESS;
    }
     
    void Bidonnage(MEMBRE *mbr)
    {
    	FILE *fp = NULL;
    	int i;
     
    	fp = fopen("Membre.dat", "w+b");
     
    	mbr->numlicense = "-1";
    	mbr->nom = " ";
    	mbr->prenom = " ";
     
    	i = 0;
    	while(i < 100)
    	{
    		fwrite(mbr, sizeof(MEMBRE), 1, fp);
    		i++;
    	}
     
    	fclose(fp);
    }
     
    void Init(INDEX *ind, MEMBRE *mbr)
    {
    	FILE *fp = NULL;
    	int i;
     
    	fp = fopen("Membre.dat", "r+b");
     
       if (fp != NULL)
       {
       	fread(mbr, sizeof(MEMBRE), 100, fp);
     
       	for(i=0; i<100;i++)
       	{
       		(ind+i)->position = i;
       		(ind+i)->numlicense = (mbr+i)->numlicense;
       		(ind+i)->nom = (mbr+i)->nom;
       	}
     
       	fclose(fp);
       }
    }
     
    void Ajouter(GtkWidget *widget, gpointer data)
    {
    	WIDGET *ptgui = NULL;
    	GtkWidget *ptbouton[2];
     
    	ptgui = (WIDGET *) data;
     
     
    	ptgui->ptfenetre[1] = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    	gtk_container_set_border_width(GTK_CONTAINER(ptgui->ptfenetre[1]), 5);
    	gtk_window_set_position(GTK_WINDOW(ptgui->ptfenetre[1]), GTK_WIN_POS_CENTER);
    	gtk_window_set_default_size(GTK_WINDOW(ptgui->ptfenetre[1]), 320, 200);
    	gtk_window_set_title(GTK_WINDOW(ptgui->ptfenetre[1]), "DimSoft - Ajout de membres");
     
    	ptgui->ptbox[1] = gtk_vbox_new(FALSE, 0);
    	gtk_container_add(GTK_CONTAINER(ptgui->ptfenetre[1]), ptgui->ptbox[1]);
     
    	ptgui->ptframe = gtk_frame_new("Etat civil");
    	gtk_box_pack_start(GTK_BOX(ptgui->ptbox[1]), ptgui->ptframe, TRUE, FALSE, 0);
     
    	ptgui->ptframebox = gtk_vbox_new(FALSE, 0);
    	gtk_container_add(GTK_CONTAINER(ptgui->ptframe), ptgui->ptframebox);
     
    	ptgui->ptlabel = gtk_label_new("License : ");
    	gtk_box_pack_start(GTK_BOX(ptgui->ptframebox), ptgui->ptlabel, TRUE, FALSE, 0);
    	ptgui->ptentry[0] = gtk_entry_new();
    	gtk_box_pack_start(GTK_BOX(ptgui->ptframebox), ptgui->ptentry[0], TRUE, FALSE, 0);
     
    	ptgui->ptlabel = gtk_label_new("Nom : ");
    	gtk_box_pack_start(GTK_BOX(ptgui->ptframebox), ptgui->ptlabel, TRUE, FALSE, 0);
    	ptgui->ptentry[1] = gtk_entry_new();
    	gtk_box_pack_start(GTK_BOX(ptgui->ptframebox), ptgui->ptentry[1], TRUE, FALSE, 0);
     
    	ptgui->ptlabel = gtk_label_new("Prenom : ");
    	gtk_box_pack_start(GTK_BOX(ptgui->ptframebox), ptgui->ptlabel, TRUE, FALSE, 0);
    	ptgui->ptentry[2] = gtk_entry_new();
    	gtk_box_pack_start(GTK_BOX(ptgui->ptframebox), ptgui->ptentry[2], TRUE, FALSE, 0);
     
    	ptgui->ptlabel = gtk_label_new("Date de naissance : ");
    	gtk_box_pack_start(GTK_BOX(ptgui->ptframebox), ptgui->ptlabel, TRUE, FALSE, 0);
    	ptgui->ptentry[3] = gtk_entry_new();
    	gtk_box_pack_start(GTK_BOX(ptgui->ptframebox), ptgui->ptentry[3], TRUE, FALSE, 0);
     
    	ptbouton[0] = gtk_button_new_from_stock(GTK_STOCK_OK);
    	gtk_box_pack_start(GTK_BOX(ptgui->ptbox[1]), ptbouton[0], FALSE, FALSE, 0);
     
    	ptbouton[1] = gtk_button_new_from_stock(GTK_STOCK_CANCEL);
    	gtk_box_pack_start(GTK_BOX(ptgui->ptbox[1]), ptbouton[1], FALSE, FALSE, 0);
     
    	g_signal_connect(G_OBJECT(ptbouton[0]), "clicked", G_CALLBACK(Fichier), (gpointer *) ptgui);
     
    	g_signal_connect(G_OBJECT(ptbouton[1]), "clicked", G_CALLBACK(Destruct), (gpointer *) ptgui);
     
    	gtk_widget_show_all(ptgui->ptfenetre[1]);
    }
     
    INDEX * Vide(WIDGET *ptgui, char *pt)
    {
    	int i;
    	gboolean trouve = FALSE;
     
     
    	i = 0;
    	while(i<100 && trouve == FALSE)
    	{
    		if(ptgui->ind->nom == pt)
    		{
    			trouve = TRUE;
    		}
    		else
    		{
    			ptgui->ind++;
    			i++;
    		}
    	}
     
    	if(i == 100)
    	{
    		return(NULL);
    	}
    	else
    	{
    		return(ptgui->ind);
    	}
    }
     
    void Fichier(GtkWidget *widget, gpointer data)
    {
    	FILE *fp = NULL;
    	WIDGET *ptgui = NULL;
    	char *pt = NULL;
     
     
    	ptgui = (WIDGET *) data;
    	pt = " ";
     
    	ptgui->ind = Vide(ptgui, pt);
     
    	printf("%d", ptgui->ind->position);
     
    	fp = fopen("Membre.dat", "r+b");
     
    	fseek(fp, (ptgui->ind->position) * sizeof(MEMBRE), SEEK_SET);
     
    	ptgui->mbr->numlicense = (char *)gtk_entry_get_text(GTK_ENTRY(ptgui->ptentry[0]));
     
    	fwrite(ptgui->mbr, sizeof(MEMBRE), 1, fp);
     
    	fclose(fp);
     
    	gtk_widget_destroy(ptgui->ptfenetre[1]);
     
    }
     
    void Destruct(GtkWidget *widget, gpointer data)
    {
    	WIDGET *ptgui = NULL;
     
     
    	ptgui = (WIDGET *) data;
    	gtk_widget_destroy(ptgui->ptfenetre[1]);
    }

Discussions similaires

  1. Réponses: 11
    Dernier message: 07/06/2013, 10h06
  2. passage de paramètre à une fonction passée en paramètre
    Par bambou dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 03/08/2007, 10h39
  3. Réponses: 12
    Dernier message: 04/04/2007, 09h41
  4. Réponses: 10
    Dernier message: 02/02/2007, 16h00
  5. [PL/SQL] : Passage de paramètres à une fonction
    Par dcollart dans le forum Oracle
    Réponses: 5
    Dernier message: 13/07/2006, 10h17

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