Debian-facile

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

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

#1 12-01-2020 15:33:43

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

error: variable ‘sep’ set but not used [-Werror=unused-but-set-variabl

Bon, j'ai repris a zéro, histoire d'y voir plus clair.

J'ai ce code:


#include <stdlib.h>
#include <stdio.h>
#include <gtk/gtk.h>

GtkWidget* make_sep (GtkOrientation orientation, GtkWidget *contenant);
void activate (GtkApplication *app, gpointer user_data);
GtkWidget* make_master_window (GtkApplication* app, char* nom, int longueur, int profondeur);

int main ( int argc, char **argv)
{
  GtkApplication *app;
  int status;

  app = gtk_application_new ("org.gtk.example", G_APPLICATION_FLAGS_NONE);
  g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);
  status = g_application_run (G_APPLICATION(app), argc, argv);

  return status;

}


void activate (GtkApplication *app, gpointer user_data)
{
  GtkWidget* win;
  GtkWidget* sep;

  win = make_master_window ( app, "neuneu", 100, 200);

  sep = make_sep(GTK_ORIENTATION_HORIZONTAL, win);


  gtk_widget_show_all(win);

}


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_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;
}


 


Qui me renvoit


am/top.c: In function ‘activate’:
Ram/top.c:26:13: error: variable ‘sep’ set but not used [-Werror=unused-but-set-variable]
  GtkWidget* sep;
 


Je ne comprends pas, ma variable *sep est bien la:


Void activate (GtkApplication *app, gpointer user_data)
{
  GtkWidget* win;
  GtkWidget* sep;

  win = make_master_window ( app, "neuneu", 100, 200);

  sep = make_sep(GTK_ORIENTATION_HORIZONTAL, win);


  gtk_widget_show_all(win);

}
 



Je ne sais plus ou chercherscratchhead.gif


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

Hors ligne

#2 13-01-2020 11:29:37

raleur
Membre
Inscription : 03-10-2014

Re : error: variable ‘sep’ set but not used [-Werror=unused-but-set-variabl

Une valeur est affectée à la variable locale mais elle n'est pas utilisée. Si tu n'utilises pas la valeur de retour de la fonction, inutile de l'affecter à une variable.

Dernière modification par raleur (13-01-2020 11:30:28)

Hors ligne

#3 13-01-2020 13:39:16

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 : error: variable ‘sep’ set but not used [-Werror=unused-but-set-variabl

A l'nterieur de a fonction auxilliaire,la variable est bien utilisée;


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;
}
 



Puisqu'elle renvoie un pointeur sur la variable, ça devrait être pris en compte, non?

Sii j'empaquette le sep dans une box, c'est la box a son tour d'être " set but not used".

Je dois en conculre qu'en l'état ce code n'est pas factorisable?

Dernière modification par Clem (13-01-2020 13:55:53)


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

Hors ligne

#4 13-01-2020 14:17:07

raleur
Membre
Inscription : 03-10-2014

Re : error: variable ‘sep’ set but not used [-Werror=unused-but-set-variabl

Clem a écrit :

A l'nterieur de a fonction auxilliaire,la variable est bien utilisée;


Mais ce n'est pas la même variable ; ce sont deux variables locales distinctes dont la portée est limitée à la fonction dans laquelle elles sont définies.

Clem a écrit :

Sii j'empaquette le sep dans une box, c'est la box a son tour d'être " set but not used".


Je n'ai rien compris à cette phrase.

Clem a écrit :

Je dois en conculre qu'en l'état ce code n'est pas factorisable?


Je ne connais pas la finalité de ce code. Mais si la fonction appelante n'utilise pas la valeur de retour de la fonction appelée, il est inutile de l'affecter à une variable locale.

Hors ligne

#5 13-01-2020 17:19:16

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 : error: variable ‘sep’ set but not used [-Werror=unused-but-set-variabl

Ce code visait juste a presenter un separateur sur une fenetre en factorisant un peu.



#include <stdio.h>
#include <gtk/gtk.h>

void activate (GtkApplication *app, gpointer user_data);
GtkWidget* make_master_window (GtkApplication* app, char* nom, int longueur, int profondeur);
GtkWidget* make_sep (GtkOrientation orientation, GtkWidget *contenant);

int main ( int argc, char **argv)
{
  GtkApplication *app;
  int status;

  app = gtk_application_new ("org.gtk.example", G_APPLICATION_FLAGS_NONE);
  g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);
  status = g_application_run (G_APPLICATION(app), argc, argv);

  return status;

}


void activate (GtkApplication *app, gpointer user_data)
{

    GtkWidget* sep;
 
    GtkWidget *hbox;

    GtkWidget* window;

  window =  make_master_window (app,"neuneu",100,200);

  hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL,5);
  gtk_container_add(GTK_CONTAINER(window), hbox);

  sep = make_sep (GTK_ORIENTATION_HORIZONTAL, hbox);

  gtk_widget_show_all(window);

}


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_sep (GtkOrientation orientation, GtkWidget *contenant)
{
    GtkWidget* sep;

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

}
 


Et la ça marche o.O

Ps : oui ça marche nickel, je me suis encore trouvé des problèmes la ou il n'y en avait pas.

Dernière modification par Clem (13-01-2020 17:28:10)


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

Hors ligne

#6 13-01-2020 17:37:39

raleur
Membre
Inscription : 03-10-2014

Re : error: variable ‘sep’ set but not used [-Werror=unused-but-set-variabl

Pourtant, si je lis bien, dans la fonction activate() la valeur affectée à la variable locale sep n'est pas utilisée non plus.
Les mêmes options de compilation (-Werror=unused-but-set-variable) sont utilisées ?

Hors ligne

#7 14-01-2020 13:37: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 : error: variable ‘sep’ set but not used [-Werror=unused-but-set-variabl

Quand je compile avec les options
<-Werror -Wall -ansi> et a plus forte raison avec <-Werror=unused-but-set-variable> j'ai des retours d'eeeur.


[13:31:16] clem@Sid >> gcc `pkg-config --cflags gtk+-3.0` Ram/neuneu.c -o Ram/neuneu `pkg-config --libs gtk+-3.0` -W -Werror -Wall -ansi
Ram/neuneu.c: In function ‘activate’:
Ram/neuneu.c:27:16: error: variable ‘sep’ set but not used [-Werror=unused-but-set-variable]
   27 |     GtkWidget* sep;
      |                ^~~
Ram/neuneu.c:24:46: error: unused parameter ‘user_data’ [-Werror=unused-parameter]
   24 | void activate (GtkApplication *app, gpointer user_data)
      |                                     ~~~~~~~~~^~~~~~~~~
Ram/neuneu.c: In function ‘make_sep’:
Ram/neuneu.c:64:1: error: control reaches end of non-void function [-Werror=return-type]
   64 | }
      | ^
cc1: all warnings being treated as errors

 


Par contre ça râle mais ça marche.


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

Hors ligne

#8 14-01-2020 16: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 : error: variable ‘sep’ set but not used [-Werror=unused-but-set-variabl

raleur a écrit :

Une valeur est affectée à la variable locale mais elle n'est pas utilisée. Si tu n'utilises pas la valeur de retour de la fonction, inutile de l'affecter à une variable.


Il doit y avoir quelque chose a comprendre que je ne comprends pas.
Désolé, je débute.


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

Hors ligne

#9 14-01-2020 20:19:48

raleur
Membre
Inscription : 03-10-2014

Re : error: variable ‘sep’ set but not used [-Werror=unused-but-set-variabl

Dans une fonction,
- tu définis une variable locale,
- tu affectes une valeur à cette variable,
- mais tu n'utilises jamais la valeur de cette variable.
Le compilateur considère cela comme une anomalie et génère un avertissement (traité comme une erreur avec tes options de compilation) : soit la variable ne sert à rien et tu fais des opérations inutiles, soit il manque une opération utilisant la valeur de la variable.

Pour éviter le warning, selon le cas il suffit soit d'ajouter une opération utilisant la valeur de la variable, soit de supprimer la définition et l'affectation de la variable.

Ai-je été assez clair ?

Hors ligne

#10 17-01-2020 16:06:00

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 : error: variable ‘sep’ set but not used [-Werror=unused-but-set-variabl

Parfaitement, merci smile

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

Hors ligne

#11 Hier 09:49:18

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

Re : error: variable ‘sep’ set but not used [-Werror=unused-but-set-variabl

Salut Clem,

Ram/neuneu.c:64:1: error: control reaches end of non-void function


Cela t'indique que tu ne renvoie pas de valeur à la fin de ta fonction, elle n'a pas de return. Seule les fonctions avec "void" ne renvoient pas de valeur.

Parfois il y a des "return" mélangés à des if et gcc renvoie le même message parce qu'il n'a pas de garantie que tu vas lui renvoyer quelque chose dans toutes les situations.

Généralement, j'écris mes fonctions comme cela :

GtkWidget* make_sep (GtkOrientation orientation, GtkWidget *contenant)
{
   GtkWidget* ret = NULL; ///le null permet d'initialiser le pointeur et de savoir toujours ce qu'il y a au bout, surtout si le new qui suit ne fonctionne pas.
   if(mes conditions){
       ret = gtk_separator_new (orientation);
       gtk_box_pack_start(GTK_BOX(contenant), sep, FALSE, FALSE, 5);
   } // si les conditions ne fonctionnent pas j'ai toujours l'assurance d'avoir un retour initialisé sur quelque chose que je connais (le NULL).
   return ret; // comme le retour n'est pas dans une condition ou une boucle, j'ai toujours quelque chose et ça GCC aime bien
}



Du coup comme tu auras toujours au moins un NULL tu peux surveiller la bonne initialisation dans la fonction parente


GtkWidget* sep = make_sep (GTK_ORIENTATION_HORIZONTAL, hbox);
if(sep != NULL){
  je peux passer à la suite
} else {
  je fais autrement
}

Hors ligne

Pied de page des forums