Gtk, passage de structures a des G_CALLBACK

Gtk, passage de structures a des G_CALLBACK - C - Programmation

Marsh Posté le 16-02-2008 à 16:23:21    

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
Reply

Marsh Posté le 16-02-2008 à 16:23:21   

Reply

Marsh Posté le 17-02-2008 à 23:22:19    

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/
Reply

Marsh Posté le 20-02-2008 à 15:40:16    

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
Reply

Marsh Posté le 20-02-2008 à 18:35:02    

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

Reply

Sujets relatifs:

Leave a Replay

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