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 :

Arguments dans un callback


Sujet :

GTK+ avec C & C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 10
    Points : 10
    Points
    10
    Par défaut Arguments dans un callback
    Bonjour à tous,
    Mon problème est assez similaire à celui de Yugioh, posté un peu plus en dessous.
    Néanmoins, même si le thread m'avait bien aidé, je n'obtiens pas tout à fait ce que je voudrais.
    Je m'explique : j'ai une struct avec un champ char* que je voudrais passer en paramètre du callback. Quand je veux récupérer cette valeur dans ma fonction, j'obtiens un nombre et non une chaine de caractères. Après pas mal d'essais, je me trouve un peu démuni devant la situation.

    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
     
    #include <stdlib.h>
    #include <gtk/gtk.h>
    #include <gdk/gdkkeysyms.h>
     
    typedef struct _GtkEntry GtkEntry;
    typedef struct s_str *t_str;
     
    struct s_str
    {
      char *str;
    };
     
    int main(int argc, char **argv)
    {
    	GtkWidget *pWindow, *todoBox, *toolBox, *container, *entry[10], *label, *pToolbar, *new, *save, *open, *create;
    	int s = 0;
     
    	t_str newstr = malloc(sizeof(struct s_str));
    	newstr->str = "Hello";
     
    	void newfield(GtkWidget *widget, gpointer data)
    	{
    		t_str test = (t_str)data;
    		entry[s]= gtk_entry_new ();
    		gtk_entry_set_text (GTK_ENTRY (entry[s]), g_strdup_printf("%d", test->str)); // M'affiche un nombre et non "Hello"
    		gtk_container_add (GTK_CONTAINER (todoBox), entry[s]);
    		s++;
    		gtk_widget_show_all(pWindow);
    	}
     
    	gtk_init(&argc,&argv);
    	// Fenetre principale
    	pWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    	gtk_window_set_title(GTK_WINDOW(pWindow), "Test");
    	gtk_window_set_default_size(GTK_WINDOW(pWindow), 400, 600);
    	g_signal_connect(G_OBJECT(pWindow), "destroy", G_CALLBACK(gtk_main_quit), NULL);
     
    	container = gtk_vbox_new(FALSE, 0);
    	gtk_container_add(GTK_CONTAINER(pWindow), container);
     
    	//Création de la toolbar
    	toolBox = gtk_hbox_new(FALSE, 0);
    	gtk_container_add(GTK_CONTAINER(container), toolBox);
    	pToolbar = gtk_toolbar_new();
    	gtk_box_pack_start(GTK_BOX(toolBox), pToolbar, FALSE, FALSE, 0);
    	gtk_toolbar_set_style(GTK_TOOLBAR(pToolbar), GTK_TOOLBAR_ICONS);
     
    	// box des champs
    	todoBox = gtk_vbox_new(TRUE, 1);
    	gtk_container_add(GTK_CONTAINER(container), todoBox);
     
    	create = gtk_toolbar_insert_stock(GTK_TOOLBAR(pToolbar),
    		GTK_STOCK_NEW, "New", NULL, NULL, NULL, -1);
     
    	g_signal_connect (G_OBJECT(create), "clicked", G_CALLBACK (newfield), &newstr);
     
    	gtk_widget_show_all(pWindow);
     
    	gtk_main();
     
    	return EXIT_SUCCESS;
    }
    En espérant que quelqu'un puisse m'aider. Merci d'avance !

  2. #2
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    1 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 395
    Points : 2 002
    Points
    2 002
    Par défaut
    Bonjour,

    bon, déjà, gtk_toolbar_insert_stock est obsolète depuis GTK 2.4, et à remplacer par gtk_toolbar_insert.

    Ensuite, je pense que ton problème vient de cette ligne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g_signal_connect (G_OBJECT(create), "clicked", G_CALLBACK (newfield), &newstr);
    Tu passes l'adresse de newstr, qui est pourtant déjà l'adresse de ta structure. Mais quand tu la récupères dans ta callback, tu la traites comme un pointeur vers ta structure, et non comme un pointeur de pointeur de structure.

    Révise tes définitions de type. Évite de créer des types pointeurs avec typedef si tu ne les maîtrises pas. Ici, en l'occurrence, tu pouvais déclarer une structure toute simple dans le main, et tu n'avais ainsi même pas à appeler malloc. En la déclarant dans le main, pas de soucis de durée de vie, elle aura la durée de vie de ton programme.

    Et évite les déclarations de fonctions en plein milieu d'une autre fonction, c'est ni très lisible ni très joli.
    Documentation officielle GTK+ 3:
    GTK en C, GTK en Python

    Tutoriels GTK+ 3:
    GTK en C, GTK en Python

    Tutoriels par l'exemple (platform-demos):
    GTK (tous langages)

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 10
    Points : 10
    Points
    10
    Par défaut
    Ok tout marchait, j'avais mis %d à la place de %s.
    Sans commentaires.

    Merci de ta réponse, j'ai modifié mon fichier en conséquence.

  4. #4
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    1 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 395
    Points : 2 002
    Points
    2 002
    Par défaut
    Je viens de tester, cela ne pouvait pas fonctionner en passant &newstr comme tu le faisais...
    Documentation officielle GTK+ 3:
    GTK en C, GTK en Python

    Tutoriels GTK+ 3:
    GTK en C, GTK en Python

    Tutoriels par l'exemple (platform-demos):
    GTK (tous langages)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Saisie d'arguments dans la ligne de commande
    Par sangei dans le forum Général Java
    Réponses: 20
    Dernier message: 06/12/2009, 16h08
  2. nombre d'arguments dans un ... avec va_list
    Par delfare dans le forum C
    Réponses: 5
    Dernier message: 24/01/2006, 09h20
  3. [Tableaux] double argument dans un lien
    Par ptit_bou dans le forum Langage
    Réponses: 4
    Dernier message: 15/01/2006, 01h21
  4. [Struts] Passer un argument dans un property
    Par Malaussene dans le forum Struts 1
    Réponses: 4
    Dernier message: 07/09/2004, 10h11
  5. [C#] Arguments dans Projet VS
    Par MALAGASY dans le forum EDI/Outils
    Réponses: 3
    Dernier message: 07/07/2004, 15h32

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