Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1502 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Gtk, passage de structures a des G_CALLBACK

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Gtk, passage de structures a des G_CALLBACK

n°1687302
exeed
Posté le 16-02-2008 à 16:23:21  profilanswer
 

Bonjour a tous,
 
Pour m'initier a Gtk je me suis lancé dans la programmation d'un petit programme:
 
3 boutons:
- 1 bouton départ  
- 1 bouton stop
- 1 bouton résultat
 
En fait ce prog a pour vocation de mesurer le temps qu'a mis l'utilisateur pour cliquer sur départ puis stop.
 
Cependant j'ai des problèmes de types je pense car je suis obligé de passer des éléments de structure aux fonctions callback et je ne pense pas que j'ai la bonne méthode.  
 
J'ai mis des printf un peu partout pour vérifier la valeur a différents moments mais c'est seulement a la fin que ca merde j'ai l'impression.
 
Qu'en pensez vous?  
 
Voici le code:

Code :
  1. #include <stdlib.h>
  2. #include <gtk/gtk.h>
  3. #include <stdio.h>
  4. #include <time.h>
  5. typedef struct{
  6.    int *tempsini;
  7.    int *tempsfin;
  8.     GtkWidget *monwidget;
  9.                }Test;
  10. void start_clock(GtkWidget *pWidget, gpointer pData)
  11. {
  12. pData=(int *)clock();
  13. printf("%d\n",((int)pData));
  14. }
  15. void stop_clock(GtkWidget *pWidget, gpointer pData)
  16. {
  17.   pData=(int *)clock();
  18. printf("%d\n",((int)pData));
  19. }
  20. void resultat(GtkWidget *pWidget, gpointer pData)
  21. {
  22.   Test *test=(Test *)pData;
  23.   int final=((test->tempsfin)-(test->tempsini));
  24.   gtk_label_set_text(GTK_LABEL(test->monwidget),"youpi fete" );
  25. printf("tempsfin %d\n",(int)(test->tempsfin)); 
  26. printf("tempsini %d\n",(int)(test->tempsini));
  27. printf("Difference %d\n",final);
  28. }
  29. int main(int argc, char **argv)
  30. {
  31.   GtkWidget *pWindow;
  32.   GtkWidget *pVbox;
  33.   GtkWidget *pHbox;
  34.   GtkWidget *pButtons[3];
  35.   Test test;
  36.   gtk_init(&argc,&argv);
  37. pWindow=gtk_window_new(GTK_WINDOW_TOPLEVEL);
  38. g_signal_connect(G_OBJECT(pWindow),"destroy",G_CALLBACK(gtk_main_quit),NULL);
  39. gtk_window_set_title(GTK_WINDOW(pWindow), "Les GtkBox" );
  40. gtk_window_set_default_size(GTK_WINDOW(pWindow), 320, 200);
  41. pVbox=gtk_vbox_new(TRUE,0);
  42. gtk_container_add(GTK_CONTAINER(pWindow),pVbox);
  43.   test.monwidget=gtk_label_new("Temps passe= Rien" );
  44. pButtons[0]=gtk_button_new_with_label("Depart" );
  45. pButtons[1]=gtk_button_new_with_label("Arret" );
  46. pButtons[2]=gtk_button_new_with_label("Resultat" );
  47. g_signal_connect(G_OBJECT(pButtons[0]),"clicked",G_CALLBACK(start_clock),(&test.tempsini));
  48. g_signal_connect(G_OBJECT(pButtons[1]),"clicked",G_CALLBACK(stop_clock),(&test.tempsfin));
  49. g_signal_connect(G_OBJECT(pButtons[2]),"clicked",G_CALLBACK(resultat),&test);
  50. gtk_box_pack_start(GTK_BOX(pVbox),pButtons[0],TRUE,TRUE,0);
  51. gtk_box_pack_start(GTK_BOX(pVbox),pButtons[1],TRUE,TRUE,0);
  52. gtk_box_pack_start(GTK_BOX(pVbox),pButtons[2],TRUE,TRUE,0);
  53. gtk_box_pack_start(GTK_BOX(pVbox),test.monwidget,TRUE,TRUE,0);
  54. gtk_widget_show_all(pWindow);
  55. gtk_main();
  56. return 0;
  57. }


 
 
Pour compiler, il faut la librairie gtk installée et mettre ces options:
 
gcc `pkg-config --libs --cflags gtk+-2.0` fichier.c -o fichier
 
Voila merci

Message cité 1 fois
Message édité par exeed le 16-02-2008 à 16:37:02
mood
Publicité
Posté le 16-02-2008 à 16:23:21  profilanswer
 

n°1687600
Emmanuel D​elahaye
C is a sharp tool
Posté le 17-02-2008 à 23:22:19  profilanswer
 

exeed a écrit :

Cependant j'ai des problèmes de types je pense car je suis obligé de passer des éléments de structure aux fonctions callback et je ne pense pas que j'ai la bonne méthode.  


Tu te compliques horriblement et évidemment, ça fini par être faux... Il faut rester simple :  

Code :
  1. #include <stdlib.h>
  2. #include <gtk/gtk.h>
  3. #include <stdio.h>
  4. #include <time.h>
  5. typedef struct test
  6. {
  7.    int tempsini;
  8.    int tempsfin;
  9.    GtkWidget *monwidget;
  10. }
  11. Test;
  12. void start_clock (GtkWidget * pWidget, gpointer pData)
  13. {
  14.    struct test *ptest = pData;
  15.    if (ptest != NULL)
  16.    {
  17.       ptest->tempsini = clock ();
  18.       printf ("%d\n", ptest->tempsini);
  19.    }
  20. }
  21. void stop_clock (GtkWidget * pWidget, gpointer pData)
  22. {
  23.    struct test *ptest = pData;
  24.    if (ptest != NULL)
  25.    {
  26.       ptest->tempsfin = clock ();
  27.       printf ("%d\n", ptest->tempsfin);
  28.    }
  29. }
  30. void resultat (GtkWidget * pWidget, gpointer pData)
  31. {
  32.    struct test *ptest = pData;
  33.    if (ptest != NULL)
  34.    {
  35.       int final = (ptest->tempsfin - ptest->tempsini);
  36.       gtk_label_set_text (GTK_LABEL (ptest->monwidget), "youpi fete" );
  37.       printf ("tempsfin %d\n", ptest->tempsfin);
  38.       printf ("tempsini %d\n", ptest->tempsini);
  39.       printf ("Difference %d\n", final);
  40.    }
  41. }
  42. int main (int argc, char **argv)
  43. {
  44.    GtkWidget *pWindow;
  45.    GtkWidget *pVbox;
  46.    GtkWidget *pHbox;
  47.    GtkWidget *pButtons[3];
  48.    Test test;
  49.    gtk_init (&argc, &argv);
  50.    pWindow = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  51.    g_signal_connect (G_OBJECT (pWindow), "destroy",
  52.                      G_CALLBACK (gtk_main_quit), NULL);
  53.    gtk_window_set_title (GTK_WINDOW (pWindow), "Les GtkBox" );
  54.    gtk_window_set_default_size (GTK_WINDOW (pWindow), 320, 200);
  55.    pVbox = gtk_vbox_new (TRUE, 0);
  56.    gtk_container_add (GTK_CONTAINER (pWindow), pVbox);
  57.    test.monwidget = gtk_label_new ("Temps passe= Rien" );
  58.    pButtons[0] = gtk_button_new_with_label ("Depart" );
  59.    pButtons[1] = gtk_button_new_with_label ("Arret" );
  60.    pButtons[2] = gtk_button_new_with_label ("Resultat" );
  61.    g_signal_connect (G_OBJECT (pButtons[0]), "clicked",
  62.                      G_CALLBACK (start_clock), (&test));
  63.    g_signal_connect (G_OBJECT (pButtons[1]), "clicked",
  64.                      G_CALLBACK (stop_clock), (&test));
  65.    g_signal_connect (G_OBJECT (pButtons[2]), "clicked", G_CALLBACK (resultat),
  66.                      &test);
  67.    gtk_box_pack_start (GTK_BOX (pVbox), pButtons[0], TRUE, TRUE, 0);
  68.    gtk_box_pack_start (GTK_BOX (pVbox), pButtons[1], TRUE, TRUE, 0);
  69.    gtk_box_pack_start (GTK_BOX (pVbox), pButtons[2], TRUE, TRUE, 0);
  70.    gtk_box_pack_start (GTK_BOX (pVbox), test.monwidget, TRUE, TRUE, 0);
  71.    gtk_widget_show_all (pWindow);
  72.    gtk_main ();
  73.    return 0;
  74. }



2296
4062
tempsfin 4062
tempsini 2296
Difference 1766
 
Press ENTER to continue.


Pose des questions si tu ne comprends pas.


---------------
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/
n°1689405
exeed
Posté le 20-02-2008 à 15:40:16  profilanswer
 

J'avoue etre un peu largué la...
 
Est ce possible que l'os sur lequel je suis soit en cause.(ubuntu)
 
J'ai copie intégralement ton programme, compilé et j'ai toujours 0 .
 
Cependant j'ai corrigé ce qui était faux dans mon code en laissant les clock_t .
 
Dans la fonction resultat j'ai mis ça :

Code :
  1. double final = (double)(ptest->tempsfin - ptest->tempsini)/CLOCKS_PER_SEC;
  2.  printf ("Difference %2.1f\n", final);


 
 
Ce bout de code a été pris ailleurs.


Message édité par exeed le 20-02-2008 à 15:40:36
n°1689576
Taz
bisounours-codeur
Posté le 20-02-2008 à 18:35:02  profilanswer
 

Le code d'Emmanuel est correct. Il n'y aucun problème avec ubuntu. Vu que tu utilises GTK+, faut pas se priver de la glib et de http://library.gnome.org/devel/gli [...] imers.html


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Gtk, passage de structures a des G_CALLBACK

 

Sujets relatifs
Pb de passage de variableUrl rewriting et passage de parametres
Scilab problème de callback <function>Image transparente au passage de la souris
Les structures - petite questionAppel synchrone de callback
Passage sur iframe= clic automatiquePb de structures de données dynamique delphi/pascal
Problème pour empiler des structuresGTK & table
Plus de sujets relatifs à : Gtk, passage de structures a des G_CALLBACK


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR