[GTK] probleme de lancement de fonction C a l'aide d'un bouton

probleme de lancement de fonction C a l'aide d'un bouton [GTK] - C - Programmation

Marsh Posté le 13-10-2005 à 19:59:11    

je viens de créer une interface graphique pour une simulation précédemment réalisé en C. Tout marche bien sauf que je vois pas trop comment lancer mon ancienne fonction. Je l'ai incluse dans une librairie que j'ai crée et elle est du type
 
int bleu(double A, double B, int C,int D,int E)
 
mon idée était qu'une fois tous les paramétres rentrés grace à l'apllication graphique on appuie sur Ok et le programme en C fait ses calculs dans son coin avant que le programme se ferme.
 
mais mon problème vient de ma définition de fonction dans GTK, pour le moment j'ai ça
 
gint traitement(GtkWidget *OK,GtkWidget *Fenetre) /*la fonction qui se lance quand on clique sur le bouton OK*/
{
   
  gtk_widget_hide_all(Fenetre);  /* les fenetres sont cachés pour éviter qu'on ne puisse réappuyer sur les boutons */
 
  bleu(A,  B,  C, D, E); /*le programme que je veux lancer*/
 
return 0;  
}
 
int main(int argc, char *argv[])
{
....     /*ce qui se passe quand j'appuie sur le bouton*/
 gtk_signal_connect(GTK_OBJECT(OK), "clicked", (GtkSignalFunc) traitement, Fenetre);
....
}
 
 
Mais ou diable est ce que je dis à traitement de récupérer les valeurs de A, B.... j'ai essayé de le faire comme en C classique
 
gint traitement(GtkWidget *OK,GtkWidget *Fenetre,double A, double B, int C,int D,int E)
 
et
 
  gtk_signal_connect(GTK_OBJECT(OK), "clicked", (GtkSignalFunc) traitement(A,B,C,D,E), Fenetre);
 
 
mais c'est super moche et ca marche pas du tout d'ailleurs. (Bon je m'en doutais un peu, ça marche rarement quand j'essaye de trouver la syntaxe sur un langage nouveau) donc si vous pouviez me montrer la lumiére ca m'aiderait vachtement à finir tout ça ce programme. :hello:

Reply

Marsh Posté le 13-10-2005 à 19:59:11   

Reply

Marsh Posté le 13-10-2005 à 20:09:36    

ben avec l'argument qui sert à ça.
 
"clicked"   void        user_function      (GtkButton *button,
                                            gpointer user_data);
 
 
edit: donc ton callback est pas bon de toutes façons.


Message édité par Taz le 13-10-2005 à 20:10:07
Reply

Marsh Posté le 13-10-2005 à 20:23:57    

Qu'est ce qu'il a de pas bon mon Callback. Si j'oublie ma fonction il marche très bien.
 
J'ai commencé à travailler sur un livre et la structure que j'utilise est trouvé à l'intérieur. Maintenant je débute et il est possible (peut être même sur) que je me trompe de temps à autre. donc qu'est ce qu'il a de pas bon mon callback?
 
 je vais essayer de voir ca  
"clicked"   void        user_function      (GtkButton *button,
                                            gpointer user_data);  
 
qui n'est pas dans mon livre, mais bon google mele dira surement
 
merci.

Reply

Marsh Posté le 13-10-2005 à 20:28:26    

gtk.org

Reply

Marsh Posté le 13-10-2005 à 20:32:37    

ben je suis bien avance

Reply

Marsh Posté le 13-10-2005 à 21:12:41    

...
 
sur gtk.org, t'as l'exemple avec le helloworld ...

Reply

Marsh Posté le 14-10-2005 à 00:09:15    

mrpp a écrit :

mais c'est super moche et ca marche pas du tout d'ailleurs. (Bon je m'en doutais un peu, ça marche rarement quand j'essaye de trouver la syntaxe sur un langage nouveau) donc si vous pouviez me montrer la lumiére ca m'aiderait vachtement à finir tout ça ce programme.


Comme souvent, le callback est muni d'un pointeur pour passer les données. Le principe est de passer l'adresse des données. Si il y en a plusieurs, comme ici, le plus simple est de définir une structure et de passer son adresse. Dans le callback, on définit un pointeur du même type que l'on initialise avec la valeur paramètre void *. Cette technique est extrêmement courante dans ce genre de programmation par évènement.


callback(..., void *p_user)
{
   T*p = p_user;
 
   ... = p->A;
}
 
f()
{
   T data;
   data.A = ... ;
 
   fun (..., callback, &data);
 
}


Message édité par Emmanuel Delahaye le 14-10-2005 à 00:09:58

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 14-10-2005 à 00:35:36    

oui, enfin je recommanderais pas de passer des données allouée sur la pile dans ce contexte. Ici, on parle d'interfaces graphiques et d'événements (asynchronese).
 
Donc avant tu fais un petit g_malloc, tu passes le pointeur au callback, et dans le callback, tu g_free

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed