CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[C] GTK probleme Callback et structur

Shiro777
Shiro777
Niveau 1
29 mars 2015 à 00:47:07

Bonjour à tous,

J'essaye de coder actuellement un petit programme ou l'on peut cliquer sur 2 boutons.L'un permet d'ouvrir une fenetre et de remplir un petit formulaire et l'autre d'afficher sur le terminal ce qui a été tapez dans le formulaire de la 2e fenetre. Cependant j'ai 2 petits problèmes, le premier est que la 2e fenetre ne veut pas s'ouvrir sans "une bidouille" (car j'ai au départ crée une structure qui est censé regroupé tous les widgets de la 2e fenetre, cependant je suis forcé de faire un malloc dans la fonction void ce qui n'est pas normal) et la 2e est que je n'arrive pas à récupérer les données du formulaire au moment ou je quitte ma 2e fenetre(elle disparaisse de ma structure qui se trouve dans le main mais qui était pourtant presente dans la fonction void).
Après quelques tests supplémentaires ( initialisation de wind_aj->media titre,isbn,auteur,date dans le main), j'ai remarqué que le problème vient à partir du moment où l'on fait a un callback, c'est comme si wind_aj se formatait. (J'ai directement seg fault au moment où j'utilise la fonction afficher media ajout)
En espérant avoir votre aide! Merci beaucoup !

P.S: j'ai parfois mis des choses en commentaire, en général ce sont des tests que j'ai fait pour "resoudre" le problème mais sans succès

#include <stdlib.h> #include <gtk/gtk.h> #include <gdk-pixbuf/gdk-pixbuf.h> #include "graph.h" int main(int argc, char **argv) { GtkWidget * bouton1; GtkWidget * bouton2; GtkWidget* toolbar; GtkWidget* vbox; GtkWidget* file_selection; GtkWidget* scrolled_window; struct fenetre_ajout* wind_aj=(struct fenetre_ajout*)malloc(sizeof(struct fenetre_ajout)); wind_aj->media=malloc(sizeof(struct Media));*/ wind_aj->media->titre= "test"; wind_aj->media->auteur= "test"; wind_aj->media->date = "test"; wind_aj->media->isbn = 0; gint fhauteur=480; gint flargeur=640; /* Initialisation de GTK+ */ gtk_init(&argc, &argv); GtkWidget * MainWindow = NULL; // On déclare notre prochaine fenetre principal /*Creation fenetre et icone*/ MainWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL); // Creation de la fenetre principal g_signal_connect(G_OBJECT(MainWindow), "delete-event", G_CALLBACK(gtk_main_quit), NULL); /*Personnalisation fenetre*/ gtk_window_set_title(GTK_WINDOW(MainWindow),"Media Collection");//titre /*Position et taille*/ gtk_window_set_default_size(GTK_WINDOW(MainWindow),flargeur,fhauteur);//taille gtk_window_set_position(GTK_WINDOW(MainWindow), GTK_WIN_POS_CENTER);//position gtk_window_deiconify(GTK_WINDOW(MainWindow));//deconifier /*bouton fermer*/ gtk_window_set_deletable (GTK_WINDOW(MainWindow), TRUE);//activer /*Affichage de la fenetre et boucle événementielle*/ /*creation vbox*/ /*barre de defilement*/ /*scrolled_window = gtk_scrolled_window_new (NULL, NULL); gtk_container_add(GTK_CONTAINER(MainWindow),scrolled_window); vbox=gtk_vbox_new(FALSE,5); gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrolled_window), vbox); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),GTK_POLICY_NEVER, GTK_POLICY_ALWAYS);*/ vbox=gtk_vbox_new(FALSE,5); gtk_container_add(GTK_CONTAINER(MainWindow),vbox); /*Personnalisation barre d'outil*/ toolbar= gtk_toolbar_new(); gtk_box_pack_start(GTK_BOX(vbox), toolbar, FALSE, FALSE, 0); /* Création à partir de stock */ gtk_toolbar_insert_stock(GTK_TOOLBAR(toolbar),GTK_STOCK_NEW,"Nouveau",NULL,G_CALLBACK(gtk_main_quit),NULL,-1); gtk_toolbar_insert_stock(GTK_TOOLBAR(toolbar),GTK_STOCK_OPEN,"Ouvrir",NULL,G_CALLBACK(gtk_main_quit),NULL,-1); gtk_toolbar_insert_stock(GTK_TOOLBAR(toolbar),GTK_STOCK_APPLY,"Confirmer",NULL,G_CALLBACK(gtk_main_quit),NULL,-1); gtk_toolbar_append_space(GTK_TOOLBAR(toolbar)); //ajoute un espace gtk_toolbar_insert_stock(GTK_TOOLBAR(toolbar),GTK_STOCK_SAVE,"Enregistrer",NULL,G_CALLBACK(gtk_main_quit),NULL,-1); gtk_toolbar_insert_stock(GTK_TOOLBAR(toolbar),GTK_STOCK_QUIT,"Fermer",NULL,G_CALLBACK(gtk_main_quit),NULL,-1); gtk_toolbar_set_icon_size(GTK_TOOLBAR(toolbar),GTK_ICON_SIZE_LARGE_TOOLBAR); gtk_toolbar_set_style(GTK_TOOLBAR(toolbar), GTK_TOOLBAR_ICONS ) ;//seulement icone /*personnalisation bouton*/ bouton1= gtk_button_new_with_label("Ajouter un media"); gtk_box_pack_start(GTK_BOX(vbox),bouton1,FALSE , FALSE,0); bouton2=gtk_button_new_with_label("Chercher un media"); gtk_box_pack_start(GTK_BOX(vbox),bouton2,FALSE,FALSE,2); g_signal_connect(G_OBJECT(bouton1), "clicked", G_CALLBACK(wind_ajout3), wind_aj); g_signal_connect(G_OBJECT(bouton2),"clicked",G_CALLBACK(afficher_media_ajout),wind_aj);); /*On affiche 'Fenetre' et tout ce qu'il contient*/ //gtk_widget_show_all(vbox); gtk_widget_show_all(MainWindow); gtk_main(); gtk_exit(EXIT_SUCCESS); // Fermeture de GTK+ return EXIT_SUCCESS; }

graph.c

#include "graph.h"
#include <stdlib.h>
#include <gtk/gtk.h>

 gint FH=700;
gint FL=1000;

void ajout_media_but(GtkWidget *fenetre,GtkWidget *selection, gpointer data){ //ajouter media apres avoir cliquer boutton
((struct fenetre_ajout *)data)->media=malloc(sizeof(struct Media));
 
 
((struct fenetre_ajout*)data)->media->titre=strdup((char*)gtk_entry_get_text(GTK_ENTRY(((struct fenetre_ajout*)data)->form_ajout0)));
((struct fenetre_ajout*)data)->media->auteur=(char*)gtk_entry_get_text(GTK_ENTRY(((struct fenetre_ajout*)data)->form_ajout1));
((struct fenetre_ajout*)data)->media->date=(char*)gtk_entry_get_text(GTK_ENTRY(((struct fenetre_ajout*)data)->form_ajout2));
((struct fenetre_ajout*)data)->media->isbn=atoi((char*)gtk_entry_get_text(GTK_ENTRY(((struct fenetre_ajout*)data)->form_ajout3)));//convertir char* en int atoi
 
printf("%s \n",((struct fenetre_ajout*)data)->media->auteur);
printf("%s \n",((struct fenetre_ajout*)data)->media->titre);
printf("%s \n",((struct fenetre_ajout*)data)->media->date);
printf("%d \n",((struct fenetre_ajout*)data)->media->isbn);
}
 
void wind_ajout3(GtkWidget *fenetre,GtkWidget *selection,gpointer data){
         
     
 
 printf("valeur data : %p \n",data);
    /*creation fenetre+icone*/
	printf("1\n");
   //data=(struct fenetre_ajout*)malloc(sizeof(struct fenetre_ajout));
	printf("2\n");
	    ((struct fenetre_ajout*)data)->fenetre=gtk_window_new(GTK_WINDOW_TOPLEVEL);
	
    gtk_window_set_title(GTK_WINDOW(((struct fenetre_ajout *)data)->fenetre),"Accéder à la bibliotheque multimedia");//titre
	printf("4\n");
    gtk_window_set_modal(GTK_WINDOW(((struct fenetre_ajout *)data)->fenetre), TRUE);
    gtk_window_set_default_size(GTK_WINDOW(((struct fenetre_ajout *)data)->fenetre),FL-200,FH-100);//taille
    gtk_window_set_position(GTK_WINDOW(((struct fenetre_ajout *)data)->fenetre), GTK_WIN_POS_CENTER);//position
    g_signal_connect(G_OBJECT(((struct fenetre_ajout *)data)->fenetre), "delete-event", G_CALLBACK(gtk_widget_destroy), ((struct fenetre_ajout *)data)->fenetre);
 
 
     
    /*creation box*/
    ((struct fenetre_ajout *)data)->pVBox = gtk_vbox_new(FALSE, 0);
    gtk_container_add(GTK_CONTAINER(((struct fenetre_ajout *)data)->fenetre), ((struct fenetre_ajout *)data)->pVBox);
  
    /*Insertion choix*/
 
    /*Insertion tableau pour organiser le formulaire*/
    ((struct fenetre_ajout *)data)->tableau=gtk_table_new(5,2,TRUE);
    gtk_container_add(GTK_CONTAINER(((struct fenetre_ajout *)data)->pVBox),((struct fenetre_ajout *)data)->tableau); 
 
    /*Insertion formulaire*/
        /*titre*/
 
        ((struct fenetre_ajout *)data)->titre=gtk_label_new("Titre"); 
        gtk_table_attach(GTK_TABLE(((struct fenetre_ajout *)data)->tableau),((struct fenetre_ajout *)data)->titre,0, 1,0, 1,GTK_EXPAND | GTK_FILL, GTK_EXPAND,0, 0); 
        ((struct fenetre_ajout *)data)->form_ajout0=gtk_entry_new();
        gtk_table_attach(GTK_TABLE(((struct fenetre_ajout *)data)->tableau),((struct fenetre_ajout *)data)->form_ajout0,1, 2,0, 1,GTK_EXPAND | GTK_FILL, GTK_EXPAND,0, 0);
         
        /*auteur*/
 
        ((struct fenetre_ajout *)data)->auteur=gtk_label_new("Auteur");
        gtk_table_attach(GTK_TABLE(((struct fenetre_ajout *)data)->tableau), ((struct fenetre_ajout *)data)->auteur,0, 1,1,2,GTK_EXPAND | GTK_FILL, GTK_EXPAND,0, 0);   
        ((struct fenetre_ajout *)data)->form_ajout1=gtk_entry_new();
        gtk_table_attach(GTK_TABLE(((struct fenetre_ajout *)data)->tableau), ((struct fenetre_ajout *)data)->form_ajout1,1,2,1,2,GTK_EXPAND | GTK_FILL, GTK_EXPAND,0, 0);
        /*date*/
 
        ((struct fenetre_ajout *)data)->date=gtk_label_new("Date de publication");   
        gtk_table_attach(GTK_TABLE(((struct fenetre_ajout *)data)->tableau), ((struct fenetre_ajout *)data)->date,0, 1,2,3,GTK_EXPAND | GTK_FILL, GTK_EXPAND,0, 0); 
        ((struct fenetre_ajout *)data)->form_ajout2=gtk_entry_new();
        gtk_table_attach(GTK_TABLE(((struct fenetre_ajout *)data)->tableau), ((struct fenetre_ajout *)data)->form_ajout2,1, 2,2, 3,GTK_EXPAND | GTK_FILL, GTK_EXPAND,0, 0);
        /*ISBN*/
 
        ((struct fenetre_ajout *)data)->ISBN=gtk_label_new("ISBN");
        gtk_table_attach(GTK_TABLE(((struct fenetre_ajout *)data)->tableau), ((struct fenetre_ajout *)data)->ISBN,0, 1,3,4,GTK_EXPAND | GTK_FILL, GTK_EXPAND,0, 0); 
        ((struct fenetre_ajout *)data)->form_ajout3=gtk_entry_new();
        gtk_table_attach(GTK_TABLE(((struct fenetre_ajout *)data)->tableau),((struct fenetre_ajout *)data)->form_ajout3,1, 2,3,4,GTK_EXPAND | GTK_FILL, GTK_EXPAND,0, 0);
        /*bouton ajout*/
         
        ((struct fenetre_ajout *)data)->ajout=gtk_button_new_with_label("Ajouter le media");
        //gtk_table_attach(GTK_TABLE(ajout->tableau), ajout->ajout,1, 2,4, 5,GTK_EXPAND|GTK_SHRINK, GTK_EXPAND,0, 0);
        gtk_box_pack_start(GTK_BOX(((struct fenetre_ajout *)data)->pVBox), ((struct fenetre_ajout *)data)->ajout, TRUE, FALSE, 0);
        g_signal_connect(((struct fenetre_ajout *)data)->ajout, "button-press-event", (GCallback) ajout_media_but, data);
        //g_signal_connect(ajout->ajout, "button-release-event", (GCallback) ajout_media_but, ajout);
 
     
    //data=ajout;
     //data = (void *)ajout;
        gtk_widget_show_all( ((struct fenetre_ajout *)data)->fenetre);
      //gtk_widget_show_all( ajout->fenetre);
        gtk_main();
}
 
void afficher_media_ajout(GtkWidget *fenetre,GtkWidget *selection,gpointer add){
struct fenetre_ajout* add1=(struct fenetre_ajout*)add;
//printf("%s \n",((struct fenetre_ajout *)add)->media->auteur);
//printf("%s \n",((struct fenetre_ajout *)add)->media->titre);
//printf("%s \n",((struct fenetre_ajout *)add)->media->date);
//printf("%d \n",((struct fenetre_ajout *)add)->media->isbn);
printf("%d \n",add1->media->isbn);
 
}

graph.h

#ifndef GRAPH_H
#define GRAPH_H
#include <gtk/gtk.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

 
typedef struct fenetre_ajout{
    struct Media* media;
    GtkWidget* fenetre;
    GtkWidget* pNotebook;
    GtkWidget* pVBox;
    GtkWidget* titre;
    GtkWidget* auteur;
    GtkWidget* ISBN;
    GtkWidget* date;
    GtkWidget* tableau;
    GtkWidget* ajout;
    GtkWidget *form_ajout0;
    GtkWidget *form_ajout1;
    GtkWidget *form_ajout2;
    GtkWidget *form_ajout3;
    /*char* auteur1;
    char* titre1;
    char* date1;
    int isbn1;*/
    GtkWidget* label;
} Fen;
 
typedef struct Media{
    int type;          
    char *titre;           
    char *auteur;
    char *date;
    int isbn;
}Med;
 
void ajout_media_but(GtkWidget *fenetre,GtkWidget *selection,gpointer data);
void afficher_media_ajout(GtkWidget *fenetre,GtkWidget *selection,gpointer add);
void wind_ajout3(GtkWidget *fenetre,GtkWidget *selection,gpointer data);
#endif
Message édité le 29 mars 2015 à 00:51:11 par Shiro777
COS[A-B]
COS[A-B]
Niveau 10
29 mars 2015 à 13:57:51

Salut,

Il me semble que que les fonctions qui sont appelées quand on appuie sur un bouton doivent avoir un prototype du genre : void afficher_media_ajout(GtkWidget * button, gpointer add); et non pas avec 3 arguments

Shiro777
Shiro777
Niveau 1
01 avril 2015 à 19:30:09

oui c'est ca merci !

Sous forums
  • Aide à l'achat Mac
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Internet
  • Steam Deck
  • Macintosh
  • Hardware
La vidéo du moment