Problèmes en C et en GTK

Problèmes en C et en GTK - C - Programmation

Marsh Posté le 18-02-2009 à 14:13:52    

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
Reply

Marsh Posté le 18-02-2009 à 14:13:52   

Reply

Marsh Posté le 18-02-2009 à 15:38:14    

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().

Reply

Marsh Posté le 18-02-2009 à 16:03:45    

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


---------------
Twitter
Reply

Marsh Posté le 18-02-2009 à 16:11:52    

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
Reply

Marsh Posté le 18-02-2009 à 16:22:02    

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

Reply

Marsh Posté le 18-02-2009 à 16:24:20    

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
Reply

Marsh Posté le 18-02-2009 à 17:08:09    

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
Reply

Marsh Posté le 19-02-2009 à 17:54:48    

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
Reply

Marsh Posté le 19-02-2009 à 18:58:48    

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
Reply

Marsh Posté le 19-02-2009 à 20:03:02    

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

Reply

Marsh Posté le 19-02-2009 à 20:03:02   

Reply

Marsh Posté le 19-02-2009 à 22:03:42    

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
Reply

Sujets relatifs:

Leave a Replay

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