logo Debian Debian Debian-France Debian-Facile Debian-fr.org Forum-Debian.fr Debian ? Communautés logo inclusivité

Debian-facile

Bienvenue sur Debian-Facile, site d'aide pour les nouveaux utilisateurs de Debian.

Vous n'êtes pas identifié(e).

#1 10-01-2020 14:58:35

Clem
Membre
Lieu : Au coin du bois
Distrib. : Stable
Noyau : 4.9.0-4 *-amd-64
(G)UI : XMonad & Mate
Inscription : 09-03-2010

factorisation et pointeurs de fonction ( en c )

Bonjour a tous

j'essaaie de fatoriser la creation de boutons avec gtk3 et je me retrouve avec des erreur lies aux pointeurs de fonction

Le code factorisé ressemble a ça :


GtkWidget* create_button (char* nom, GtkWidget* contenant,
      (void) (*func_un) (void), (void) (*func_deux) (void), GtkWidget* window)
{
  button = gtk_button_new_with_label(nom);
  g_signal_connect (button, "clicked", G_CALLBACK (func__un), NULL);
  g_signal_connect_swapped (button, "clicked", G_CALLBACK (func_deux), window);
  gtk_container_add (GTK_CONTAINER (contenant), button);
  gtk_box_pack_start(GTK_BOX(contenant),button, FALSE,FALSE,5);
 



et les erreurs :


4: error: expected declaration specifiers or ‘...’ before ‘(’ token
    (void) (*func_un) (void), (void) (*func_deux) (void), GtkWidget* win)
    ^
Ram/tirelire3.c:166:30: error: expected declaration specifiers or ‘...’ before ‘(’ token
    (void) (*func_un) (void), (void) (*func_deux) (void), GtkWidget* win)
                              ^

 



Je n'arrive ppas a comprendre ou est le problème help.gif

si je fais la factorisation:


 button = ("parametre", hbox, say_hello, en_travaux, window);
 



J'obtiens ça:


gcc -Wall -Werror -ansi `pkg-config --cflags gtk+-3.0` Ram/tirelire3.c -o Ram/tirelire3 `pkg-config --libs gtk+-3.0`

Ram/tirelire3.c:12:4: error: expected declaration specifiers or ‘...’ before ‘(’ token
    (void) (*func_un) (void), (void) (*func_deux) (void), GtkWidget* window);
    ^
Ram/tirelire3.c:12:30: error: expected declaration specifiers or ‘...’ before ‘(’ token
    (void) (*func_un) (void), (void) (*func_deux) (void), GtkWidget* window);
                              ^
Ram/tirelire3.c: In function ‘activate’:
Ram/tirelire3.c:151:24: error: left-hand operand of comma expression has no effect [-Werror=unused-value]
   button = ("parametre", hbox, say_hello, en_travaux, window);
                        ^
Ram/tirelire3.c:151:30: error: left-hand operand of comma expression has no effect [-Werror=unused-value]
   button = ("parametre", hbox, say_hello, en_travaux, window);
                              ^
Ram/tirelire3.c:151:41: error: left-hand operand of comma expression has no effect [-Werror=unused-value]
   button = ("parametre", hbox, say_hello, en_travaux, window);
                                         ^
Ram/tirelire3.c:151:53: error: left-hand operand of comma expression has no effect [-Werror=unused-value]
   button = ("parametre", hbox, say_hello, en_travaux, window);
                                                     ^
Ram/tirelire3.c: At top level:
Ram/tirelire3.c:164:4: error: expected declaration specifiers or ‘...’ before ‘(’ token
    (void) (*func_un) (void), (void) (*func_deux) (void), GtkWidget* window)
    ^
Ram/tirelire3.c:164:30: error: expected declaration specifiers or ‘...’ before ‘(’ token
    (void) (*func_un) (void), (void) (*func_deux) (void), GtkWidget* window)
                              ^
cc1: all warnings being treated as errors

 


Moi, je suis PC (x86_64) et formater windows, c'était MON idée
Le sommeil de la raison ...

Hors ligne

#2 10-01-2020 17:06:08

raleur
Membre
Inscription : 03-10-2014

Re : factorisation et pointeurs de fonction ( en c )

Je ne sais pas si ça a une importance ou pas et je n'ai pas fait de C depuis très longtemps, mais je n'aurais pas mis de parenthèses autour du type "void" de la valeur de retour des pointeurs de fonctions.

Quant à l'expression à droite de button =, je ne comprends pas sa finalité. Tu n'aurais pas oublié le nom de la fonction ?

Il vaut mieux montrer que raconter.

Hors ligne

#3 11-01-2020 16:31:46

Clem
Membre
Lieu : Au coin du bois
Distrib. : Stable
Noyau : 4.9.0-4 *-amd-64
(G)UI : XMonad & Mate
Inscription : 09-03-2010

Re : factorisation et pointeurs de fonction ( en c )

Bonjour smile

J'ai ceci comme erreur en particulier :


Ram/tirelire2.c:119:9: error: assignment to ‘GtkWidget *{aka ‘struct _GtkWidget *} from ‘int’ makes pointer from integer without a cast [-Werror=int-conversion]
  button =  make_button ( "Nouveau", hbox, &say_hello, &make_win, window);
         ^
Ram/tirelire2.c:120:9: error: assignment to ‘GtkWidget *{aka ‘struct _GtkWidget *} from ‘int’ makes pointer from integer without a cast [-Werror=int-conversion]
  button =  make_button ( "Parametres", hbox, &say_hello, &make_win, window);
         ^
Ram/tirelire2.c:121:9: error: assignment to ‘GtkWidget *{aka ‘struct _GtkWidget *} from ‘int’ makes pointer from integer without a cast [-Werror=int-conversion]
  button =  make_button ( "Quit", hbox, &say_goodbye, gtk_widget_destroy, window);

 

Dernière modification par Clem (11-01-2020 17:04:26)


Moi, je suis PC (x86_64) et formater windows, c'était MON idée
Le sommeil de la raison ...

Hors ligne

#4 11-01-2020 16:41:22

Clem
Membre
Lieu : Au coin du bois
Distrib. : Stable
Noyau : 4.9.0-4 *-amd-64
(G)UI : XMonad & Mate
Inscription : 09-03-2010

Re : factorisation et pointeurs de fonction ( en c )

J'ai r"epris a zéro ôr isoler les erreurs.
Ce code:


GtkWidget *win;
  GtkWidget *vbox, *hbox;
  GtkWidget *sep;
  GtkWidget *frame;
  GtkWidget* label;


  win = make_master_window (app, "feuille", 200,300);

  vbox = make_box (win, GTK_ORIENTATION_VERTICAL);
  hbox = make_box (vbox, GTK_ORIENTATION_HORIZONTAL);
  frame = make_frame ("Bidouille", hbox);
  label = make_label (frame, "hahaha");
  frame = make_frame ("Machin", hbox);
  label = make_label (frame, "hohoho");


  sep = make_sep ( GTK_ORIENTATION_HORIZONTAL, vbox);
  hbox = make_box (vbox, GTK_ORIENTATION_HORIZONTAL);
  frame = make_frame ("Feuille", vbox);
  frame = make_frame ("Beton", vbox);

  sep = make_sep ( GTK_ORIENTATION_HORIZONTAL, vbox);
  frame = make_frame ("Buisson", vbox);
 
  gtk_widget_show_all(win);
}

 





GtkWidget* make_label (GtkWidget* contenant, char *lbl)
{
  GtkWidget* label;
  label = gtk_label_new (lbl);
  gtk_container_add ( GTK_CONTAINER (contenant), label);

  return label;
}

GtkWidget* make_master_window (GtkApplication* app, char* nom, int longueur, int profondeur)
{
  GtkWidget* window;

  window = gtk_application_window_new(app);

  gtk_window_set_title (GTK_WINDOW (window),nom);
  gtk_container_set_border_width (GTK_CONTAINER( window), 10);
  gtk_window_set_default_size (GTK_WINDOW (window), longueur, profondeur);
 
  return window;
}
GtkWidget* make_box ( GtkWidget* contenant, GtkOrientation orientation)
{
  GtkWidget *box;
  box = gtk_box_new (orientation, 10);
  gtk_box_pack_start(GTK_BOX (contenant), box, FALSE, FALSE, 5);

  return box;
}

GtkWidget* make_sep (GtkOrientation orientation, GtkWidget *contenant)
{
  GtkWidget* sep;

  sep = gtk_separator_new (orientation);
  gtk_box_pack_start ( GTK_BOX(contenant), sep, FALSE, FALSE, 5);

  return sep;
}

GtkWidget* make_frame (char *nom, GtkWidget* contenant)
{
  GtkWidget* frame;
frame = gtk_frame_new(nom);
  gtk_box_pack_start(GTK_BOX (contenant), frame, FALSE, FALSE, 5);

  return frame;
}


 


me renvoit:


clem@debian:~$ gcc -Wall -Werror -ansi `pkg-config --cflags gtk+-3.0` Ram/niou.c -o Ram/niou `pkg-config --libs gtk+-3.0`
Ram/niou.c: In function ‘activate’:
Ram/niou.c:31:13: error: variable ‘label’ set but not used [-Werror=unused-but-set-variable]
  GtkWidget* label;
             ^~~~~
Ram/niou.c:29:13: error: variable ‘sep’ set but not used [-Werror=unused-but-set-variable]
  GtkWidget *sep;
             ^~~
cc1: all warnings being treated as errors

 


Pourtant les variables en question sont utilisés.

Dernière modification par Clem (11-01-2020 17:05:12)


Moi, je suis PC (x86_64) et formater windows, c'était MON idée
Le sommeil de la raison ...

Hors ligne

#5 11-01-2020 17:03:55

Clem
Membre
Lieu : Au coin du bois
Distrib. : Stable
Noyau : 4.9.0-4 *-amd-64
(G)UI : XMonad & Mate
Inscription : 09-03-2010

Re : factorisation et pointeurs de fonction ( en c )

raleur a écrit :


Quant à l'expression à droite de button =, je ne comprends pas sa finalité. Tu n'aurais pas oublié le nom de la fonction ?



J'ai oublié des morceau. Il faut lire


button = make_button ("parametre", hbox, say_hello, en_travaux, window);
 
 


Moi, je suis PC (x86_64) et formater windows, c'était MON idée
Le sommeil de la raison ...

Hors ligne

#6 19-01-2020 13:48:30

kao
Modérateur
Distrib. : Testing
Noyau : Linux 4.quelquechose
(G)UI : Gnome 3
Inscription : 27-09-2012
Site Web

Re : factorisation et pointeurs de fonction ( en c )

Salut Clem,

clem@debian:~$ gcc -Wall -Werror -ansi `pkg-config --cflags gtk+-3.0` Ram/niou.c -o Ram/niou `pkg-config --libs gtk+-3.0`
Ram/niou.c: In function ‘activate’:
Ram/niou.c:31:13: error: variable ‘label’ set but not used [-Werror=unused-but-set-variable]
  GtkWidget* label;
             ^~~~~
Ram/niou.c:29:13: error: variable ‘sep’ set but not used [-Werror=unused-but-set-variable]
  GtkWidget *sep;
             ^~~
cc1: all warnings being treated as errors



A mon avis, la compilation passe mais avec l'option "-Werror" tu traites les warnings comme des erreurs et fait échouer la compilation.
gcc t'informe juste que tu n'utilises pas les deux pointeurs que tu as créé :

  GtkWidget *sep;
  GtkWidget* label;


Voici les options que j’utilise pour la compilation :

-Wall -Wextra -Wno-deprecated-declarations -g


L'option "-g" est utile pour passer ton programme dans Valgrind ou Linux-Perf. Garde là pendant le temps de dev.
GCC est vraiment top, il ne faut pas hésiter à écouter ses conseils smile Et il est bon d'avoir le moins de warning possible. (Zéro c'est le mieux).

Pense à libérer les mémoires allouer à la fin de ton programme, un "new" appelle toujours un "delete" il faut juste savoir quand le déclencher.

Hors ligne

#7 26-01-2020 18:55:17

Clem
Membre
Lieu : Au coin du bois
Distrib. : Stable
Noyau : 4.9.0-4 *-amd-64
(G)UI : XMonad & Mate
Inscription : 09-03-2010

Re : factorisation et pointeurs de fonction ( en c )

merci.gif

Moi, je suis PC (x86_64) et formater windows, c'était MON idée
Le sommeil de la raison ...

Hors ligne

Pied de page des forums