koskoz They see me trollin they hatin | 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 :
- int gridNbr(int level, FILE **myFile)
- {
- char chara;
- int lineNbr=0;
- // We open the file in function of the difficulty
- switch(level)
- {
- case 0 :
- *myFile = fopen("grilles/facile.sud", "r" );
- break;
- case 1 :
- *myFile = fopen("grilles/moyen.sud", "r" );
- break;
- case 2 :
- *myFile = fopen("grilles/difficile.sud", "r" );
- break;
- }
- if (*myFile == NULL)
- {
- printf("\nUne erreur est survenue lors du chargement du fichier !\n" );
- return 0;
- }
- // We count the number of grids
- while ((fscanf(*myFile, "%c", &chara)) != EOF)
- {
- if (chara == '\n')
- {
- lineNbr++;
- }
- }
- fseek (*myFile, 0, SEEK_SET);
- // We return the number of grids
- return (lineNbr / 9);
- }
|
Et dans celle-ci j'essaye de récupérer son contenu :
Code :
- void loadGrid(GtkWidget *widget, gpointer data, FILE *myFile)
- {
- gint i=0, j=0, grid = GPOINTER_TO_INT(data);
- gchar caractere;
- gint nbr;
- while (i < grid*9)
- {
- fscanf(myFile, "%c", &caractere);
- g_print("%c", caractere);
- nbr = atoi(&caractere);
- if (caractere != '\n')
- gridValue[j] = nbr;
- if (caractere == '\n') i++;
- if (j<81)
- j++;
- }
- refresh();
- }
|
Second problème :
Je n'arrive pas à récupérer la valeur d'une ligne sélectionnée dans une treelist :
Code :
- void init_list(GtkWidget *list)
- {
- GtkCellRenderer *renderer;
- GtkTreeViewColumn *column;
- GtkListStore *store;
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes("List Items",
- renderer, "text", LIST_ITEM, NULL);
- gtk_tree_view_append_column(GTK_TREE_VIEW(list), column);
- store = gtk_list_store_new(N_COLUMNS, G_TYPE_INT);
- gtk_tree_view_set_model(GTK_TREE_VIEW(list),
- GTK_TREE_MODEL(store));
- g_object_unref(store);
- }
|
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 :
- void selectGrid(GtkWidget *widget, gpointer data)
- {
- FILE *myFile = NULL;
- GtkWidget *window;
- GtkWidget *list;
- GtkWidget *vbox;
- GtkWidget *label;
- GtkWidget *play;
- GtkTreeSelection *selection;
- int i, level = GPOINTER_TO_INT(data);
- window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
- gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
- gtk_container_set_border_width(GTK_CONTAINER(window), 10);
- gtk_widget_set_size_request(window, 270, 250);
- gtk_window_set_title(GTK_WINDOW(window), "Grilles :" );
- list = gtk_tree_view_new();
- gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(list), FALSE);
- vbox = gtk_vbox_new(FALSE, 0);
- gtk_box_pack_start(GTK_BOX(vbox), list, TRUE, TRUE, 5);
- label = gtk_label_new("" );
- gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_CENTER);
- gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 5);
- gtk_container_add(GTK_CONTAINER(window), vbox);
- init_list(list);
- for(i=0; i<gridNbr(level, &myFile); i++)
- {
- add_to_list(list, i+1);
- }
- selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(list));
- // We catch the value of the selected row
- GtkTreeIter iter;
- GtkTreeModel *model;
- gint value;
- if (gtk_tree_selection_get_selected(
- GTK_TREE_SELECTION(selection), &model, &iter)) {
- gtk_tree_model_get(model, &iter, LIST_ITEM, &value, -1);
- }
- play = gtk_button_new_with_label("Jouer" );
- gtk_box_pack_start(GTK_BOX(vbox), play, TRUE, TRUE, 0);
- gtk_widget_set_size_request(play, 150, 75);
- g_signal_connect(G_OBJECT(play),"clicked", G_CALLBACK(loadGrid), (gpointer) value);
- g_signal_connect_swapped (G_OBJECT (play), "clicked", G_CALLBACK (gtk_widget_destroy), (gpointer) window);
- gtk_widget_show_all(window);
- }
|
Troisième problème :
Code :
- void loadGrid(GtkWidget *widget, gpointer data, FILE *myFile)
- {
- gint i=0, j=0, grid = GPOINTER_TO_INT(data);
- gchar caractere;
- gint nbr;
- //grids = fopen("grilles/facile.sud", "r" );
- while (i < grid*9)
- {
- fscanf(myFile, "%c", &caractere);
- g_print("%c", caractere);
- nbr = atoi(&caractere);
- if (caractere != '\n')
- gridValue[j] = nbr;
- if (caractere == '\n') i++;
- if (j<81)
- j++;
- }
- }
|
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 ---------------
Twitter
|