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

  FORUM HardWare.fr
  Programmation
  C

  Problèmes en C et en GTK

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Problèmes en C et en GTK

n°1852549
koskoz
They see me trollin they hatin
Posté le 18-02-2009 à 14:13:52  profilanswer
 

Salut tout le monde,
je suis en train de développer un Sudoku en C et avec GTK, mais je rencontre quelques problèmes, aussi bien avec GTK qu'avec le langage lui même.
 
Premier problème :
 
Tout d'abord, j'ai un problème avec l'utilisation des pointeurs, plus particulièrement un pointeur de fichier, pour le passer de fonctions en fonctions.
 
Dans cette fonction, j'ouvre un fichier :

Code :
  1. int gridNbr(int level, FILE **myFile)
  2. {
  3.     char chara;
  4.     int lineNbr=0;
  5.     // We open the file in function of the difficulty
  6.     switch(level)
  7.     {
  8.         case 0 :
  9.             *myFile = fopen("grilles/facile.sud", "r" );
  10.             break;
  11.         case 1 :
  12.             *myFile = fopen("grilles/moyen.sud", "r" );
  13.             break;
  14.         case 2 :
  15.             *myFile = fopen("grilles/difficile.sud", "r" );
  16.             break;
  17.     }
  18.     if (*myFile == NULL)
  19.     {
  20.         printf("\nUne erreur est survenue lors du chargement du fichier !\n" );
  21.         return 0;
  22.     }
  23.     // We count the number of grids
  24.     while ((fscanf(*myFile, "%c", &chara)) != EOF)
  25.     {
  26.         if (chara == '\n')
  27.         {
  28.             lineNbr++;
  29.         }
  30.     }
  31.     fseek (*myFile, 0, SEEK_SET);
  32.     // We return the number of grids
  33.     return (lineNbr / 9);
  34. }


 
Et dans celle-ci j'essaye de récupérer son contenu :
 

Code :
  1. void loadGrid(GtkWidget *widget, gpointer data, FILE *myFile)
  2. {
  3.     gint i=0, j=0, grid = GPOINTER_TO_INT(data);
  4.     gchar caractere;
  5.     gint nbr;
  6.     while (i < grid*9)
  7.     {
  8.         fscanf(myFile, "%c", &caractere);
  9.         g_print("%c", caractere);
  10.         nbr = atoi(&caractere);
  11.         if (caractere != '\n')
  12.             gridValue[j] = nbr;
  13.         if (caractere == '\n')  i++;
  14.         if (j<81)
  15.             j++;
  16.     }
  17.     refresh();
  18. }


 
Second problème :
 
Je n'arrive pas à récupérer la valeur d'une ligne sélectionnée dans une treelist :
 

Code :
  1. void init_list(GtkWidget *list)
  2. {
  3.     GtkCellRenderer *renderer;
  4.     GtkTreeViewColumn *column;
  5.     GtkListStore *store;
  6.     renderer = gtk_cell_renderer_text_new();
  7.     column = gtk_tree_view_column_new_with_attributes("List Items",
  8.           renderer, "text", LIST_ITEM, NULL);
  9.     gtk_tree_view_append_column(GTK_TREE_VIEW(list), column);
  10.     store = gtk_list_store_new(N_COLUMNS, G_TYPE_INT);
  11.     gtk_tree_view_set_model(GTK_TREE_VIEW(list),
  12.       GTK_TREE_MODEL(store));
  13.     g_object_unref(store);
  14. }


 
Dans cette fonction, le gtk_tree_model_get ne renvoit pas la bonne valeur, mais "123456" (alors qu'il devrait affecter à "value" 1 ou 2 ou 3, etc).
 

Code :
  1. void selectGrid(GtkWidget *widget, gpointer data)
  2. {
  3.     FILE *myFile = NULL;
  4.     GtkWidget *window;
  5.     GtkWidget *list;
  6.     GtkWidget *vbox;
  7.     GtkWidget *label;
  8.     GtkWidget *play;
  9.     GtkTreeSelection *selection;
  10.     int i, level = GPOINTER_TO_INT(data);
  11.     window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  12.     gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
  13.     gtk_container_set_border_width(GTK_CONTAINER(window), 10);
  14.     gtk_widget_set_size_request(window, 270, 250);
  15.     gtk_window_set_title(GTK_WINDOW(window), "Grilles :" );
  16.     list = gtk_tree_view_new();
  17.     gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(list), FALSE);
  18.     vbox = gtk_vbox_new(FALSE, 0);
  19.     gtk_box_pack_start(GTK_BOX(vbox), list, TRUE, TRUE, 5);
  20.     label = gtk_label_new("" );
  21.     gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_CENTER);
  22.     gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 5);
  23.     gtk_container_add(GTK_CONTAINER(window), vbox);
  24.     init_list(list);
  25.     for(i=0; i<gridNbr(level, &myFile); i++)
  26.     {
  27.         add_to_list(list, i+1);
  28.     }
  29.     selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(list));
  30.     // We catch the value of the selected row
  31.     GtkTreeIter iter;
  32.     GtkTreeModel *model;
  33.     gint value;
  34.     if (gtk_tree_selection_get_selected(
  35.       GTK_TREE_SELECTION(selection), &model, &iter)) {
  36.             gtk_tree_model_get(model, &iter, LIST_ITEM, &value,  -1);
  37.     }
  38.     play = gtk_button_new_with_label("Jouer" );
  39.     gtk_box_pack_start(GTK_BOX(vbox), play, TRUE, TRUE, 0);
  40.     gtk_widget_set_size_request(play, 150, 75);
  41.     g_signal_connect(G_OBJECT(play),"clicked", G_CALLBACK(loadGrid), (gpointer) value);
  42.     g_signal_connect_swapped (G_OBJECT (play), "clicked", G_CALLBACK (gtk_widget_destroy), (gpointer) window);
  43.     gtk_widget_show_all(window);
  44. }


 
Troisième problème :
 

Code :
  1. void loadGrid(GtkWidget *widget, gpointer data, FILE *myFile)
  2. {
  3.     gint i=0, j=0, grid = GPOINTER_TO_INT(data);
  4.     gchar caractere;
  5.     gint nbr;
  6.     //grids = fopen("grilles/facile.sud", "r" );
  7.     while (i < grid*9)
  8.     {
  9.         fscanf(myFile, "%c", &caractere);
  10.         g_print("%c", caractere);
  11.         nbr = atoi(&caractere);
  12.         if (caractere != '\n')
  13.             gridValue[j] = nbr;
  14.         if (caractere == '\n')  i++;
  15.         if (j<81)
  16.             j++;
  17.     }
  18. }


 
Cette fonction devrait copier chaque caractère de mon fichier (une grille de sudoku, donc 9 chiffres 9 ligne, chaque chiffre étant séparé d'un espace) dans le tableau (global) gridValue.
Or, une fois la copie faite, au lieu d'avoir des nombres compris entre 0 et 9 comme ceux du fichier, j'ai ce genre de chiffres :  
48 32 48 39...
 
Voilà, trois problèmes qui me font vraiment ch***, merci d'avance :jap:


---------------
Twitter
mood
Publicité
Posté le 18-02-2009 à 14:13:52  profilanswer
 

n°1852603
olivthill
Posté le 18-02-2009 à 15:38:14  profilanswer
 

FILE *myFile;
...
fscanf(myFile, "%c", &caractere);

myFile n'est pas un caractère, c'est un pointeur sur une structure, qui est gérée en interne par le système. Il ne faut pas initialiser myFile autrement qu'avec le retour de fopen().

n°1852644
koskoz
They see me trollin they hatin
Posté le 18-02-2009 à 16:03:45  profilanswer
 

Je suis donc obligé de faire un fopen dans la fonction qui fait le scanf ?


---------------
Twitter
n°1852650
olivthill
Posté le 18-02-2009 à 16:11:52  profilanswer
 

Excusez-moi, j'ai lu trop rapidement. Je me suis trompé. J'ai cru que c'était scanf(), parce que je n'emploie jamais fscanf() pour un caractère, je fais un fgetc() à la place. Mais cela n'a pas de rapport avec le problème.


Message édité par olivthill le 18-02-2009 à 16:22:45
n°1852658
Taz
bisounours-codeur
Posté le 18-02-2009 à 16:22:02  profilanswer
 

fscanf c'est pas ce que tu veux. Si tu veux compter les caractères, tous, c'est fgetc qu'il te faut utiliser.

n°1852659
koskoz
They see me trollin they hatin
Posté le 18-02-2009 à 16:24:20  profilanswer
 

Mon comptage de caractère ne me pose pas de problème, là où j'ai un problème c'est au fscanf pour copier chaque caractère dans valueGrid.


---------------
Twitter
n°1852697
koskoz
They see me trollin they hatin
Posté le 18-02-2009 à 17:08:09  profilanswer
 

Bon, j'ai résolu mon troisième problème, c'était assez stupide de ma part d'ailleurs.
 
Par contre, nouveau problème :
 

Code :
  1. void refresh() {
  2.     gchar valueBtn;
  3.     gint i;
  4.     for (i=0; i<81; i++) {
  5.         // Si la valeur est égale à 0, on
  6.         // ne l'affiche pas
  7.         if (gridValue[i] != '0')
  8.             gtk_button_set_label (GTK_BUTTON(button[i]), &gridValue[i]);
  9.     }
  10. }


 
La label de mon bouton a plus d'une valeur en même temps.


---------------
Twitter
n°1853091
koskoz
They see me trollin they hatin
Posté le 19-02-2009 à 17:54:48  profilanswer
 

Code :
  1. void getValue(GtkWidget *widget, gpointer data)
  2. {
  3.   GtkTreeIter iter;
  4.   GtkTreeModel *model;
  5.   char *value;
  6.   if (gtk_tree_selection_get_selected(
  7.       GTK_TREE_SELECTION(data), &model, &iter)) {
  8.         gtk_tree_model_get(model, &iter, LIST_ITEM, &value,  -1);
  9.   }
  10.     g_print("%c", *value);
  11. }


 

Code :
  1. void loadGrid(GtkWidget *widget, gpointer data, FILE *myFile, char *value)
  2. {
  3.     gint i;
  4.     gint chiffre;
  5.     FILE *grids;
  6.     gint grid = GPOINTER_TO_INT(data);
  7.     g_print("%c", *value);
  8.     grids = fopen("grilles/facile.sud", "r" );
  9.     for (i=0; i<81; i++) {
  10.         fscanf(grids, " %d ", &chiffre);
  11.         gridValue[i] = chiffre;
  12.     }
  13.     refresh();
  14. }


 
Normal que value n'ait pas la même valeur dans loadGrid que dans getValue ?


---------------
Twitter
n°1853109
koskoz
They see me trollin they hatin
Posté le 19-02-2009 à 18:58:48  profilanswer
 

Fallait rajouter une seconde étoile et quelques autres modification.
 
Par contre, cette fonction me pète un segmentation fault :
 

Code :
  1. void gridNbr(int level)
  2. {
  3.     char chara;
  4.     int lineNbr=0;
  5.     FILE **myFile=NULL;
  6.     // We open the file in function of the difficulty
  7.     switch(level)
  8.     {
  9.         case 0 :
  10.             *myFile = fopen("grilles/facile.sud", "r" );
  11.             break;
  12.         case 1 :
  13.             *myFile = fopen("grilles/moyen.sud", "r" );
  14.             break;
  15.         case 2 :
  16.             *myFile = fopen("grilles/difficile.sud", "r" );
  17.             break;
  18.     }
  19. }


---------------
Twitter
n°1853132
Taz
bisounours-codeur
Posté le 19-02-2009 à 20:03:02  profilanswer
 

ben *myfile tu déférence un pointeur null ...

mood
Publicité
Posté le 19-02-2009 à 20:03:02  profilanswer
 

n°1853243
koskoz
They see me trollin they hatin
Posté le 19-02-2009 à 22:03:42  profilanswer
 

Je fais vraiment n'importe quoi quand je m'y prends au dernier moment, je prends plus le temps de réfléchir n'y de relire les conneries que j'écrais [:prozac]


---------------
Twitter

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

  Problèmes en C et en GTK

 

Sujets relatifs
Persistance en C#C++ avec GDI+ convertir Tiff compressé LZW en Tiff compressé CCITT4
Question débile - fonctions membres C++[C++] Eclipse + CDT pour dev en C++ vous en pensez quoi?
Fonction md5() en C[C++] transformer du texte en vocale
Problème pour un exécutable en langage C - SDLproblèmes avec order
[C][Linux]Que fait un programme qui reçoit un signal ?[C++] mot de passe et console DOS
Plus de sujets relatifs à : Problèmes en C et en GTK


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