J'essaie d'implémenter un solveur de sudoku. Pour ce faire, j'utilise une structure, illustrée ci-dessous, pour représenter une cellule sur un tableau de sudoku. Je déclare ensuite un tableau 9x9 de ces structures pour représenter le tableau.
la structure cellulaire :
struct cell{
char value;
unsigned int possible;
};
Ensuite, je déclare un tableau de structures comme :
struct cell board[9][9];
Mon problème est que lorsque j'essaie d'entrer une valeur dans le tableau (c'est-à-dire board[2][2].value = getchar() ;), parfois cela fonctionne, et d'autres fois j'obtiens cette erreur :
Bus error: 10
Je ne sais pas exactement ce que cela signifie... En quoi "Bus error : 10" diffère d'une erreur de segmentation ?
J'utilise gcc et j'édite avec vim. Mon sentiment est que j'ai besoin d'allouer dynamiquement la mémoire pour ce tableau. Maintenant, je comprends comment utiliser malloc pour allouer de la mémoire pour un tableau à deux dimensions, quelque chose comme ça :
int ** Array;
Array = (int**) malloc(x_size*sizeof(int*));
for (int i = 0; i < x_size; i++)
Array[i] = (int*) malloc(y_size*sizeof(int));
Mais j'ai du mal à mettre en œuvre la partie allocation de mémoire pour un tableau de structs à 2 dimensions.
Est-ce que cela ressemblerait à ceci ?
struct cell** board;
board = (struct cell**) malloc(x_size*sizeof(struct cell**));
for(int i=0; i< x_size; i++)
board[i] = (struct cell*) malloc(y_size*sizeof(struct cell));
Je crains que cette " sizeof(struct cell) " n'alloue pas correctement la quantité de mémoire qu'elle devrait.
Toute aide serait grandement appréciée ! Je suis assez novice en C (le C++ est ma langue maternelle), j'ai beaucoup utilisé le C intégré, mais j'essaie de mieux comprendre le langage dans son ensemble.
Points bonus pour les détails \in des explications approfondies !
Gracias.
EDIT Je n'ai toujours pas mis en place d'allocation dynamique de mémoire, mais, comme demandé, voici le code qui produit l'erreur de bus :
/* only code being used in solver.h*/
29 /* structure to describe a cell */
30 struct cell{
31 int value;
32 unsigned int possible;
33 };
/*solver.c*/
4 #include <ctype.h>
5 #include <stdio.h>
6 #include "solver.h"
7
8
9 struct cell board [9][9];
10
11
12 int main(){
13 initialize_board();
14 print_board();
15 setup_board();
16 print_board();
17 return 0;
18 }
19
20 void print_board(){
21 int i=0, j=0;
22 for(i = 0; i<9; i++){
23 for(j = 0; j<9; j++)
24 printf(" %d",board[i][j].value);
25 printf("\n");
26 }
27 }
28
29 void initialize_board(){
30 int i = 0, j = 0;
31
32 for(i = 0; i<9; i++)
33 for(j = 0; j<9; j++){
34 (board[i][j]).value = 0;
35 (board[i][j]).possible = 0x1FF;
36 }
37 }
38
39 void setup_board(){
40 int row=0, col=0, val = 0;
41 char another = 'Y';
42
43 printf("Board Initial Setup.\nEnter the row and column number of the value to be entered into the board.");
44 printf("\nRow and Column indexes start at one, from top left corner.");
45 while(another == 'Y'){
46 printf("\nRow: ");
47 row = getchar();
48 printf("Column: ");
49 getchar();
50 col = getchar();
51 printf("Value: ");
52 getchar();
53 (board[row-1][[col-1]).value = getchar();
54 printf("Enter another value? (y/n): ");
55 getchar();
56 another = toupper(getchar());
57 getchar();
58 }
59 }
Comme vous pouvez le voir, j'ai changé le type de données de la valeur en int pour correspondre au type de retour de getchar(). Mais mon code produit toujours des erreurs d'exécution/résultats étranges. Par exemple, dans la première itération de la boucle while dans setup_board, je peux entrer Row:1, Col:1, Value:5, puis lorsque j'entre 'n' pour quitter, le tableau devrait être imprimé avec 5 dans le coin supérieur gauche, mais ce n'est pas le cas. La matrice imprimée est toujours dans l'état où elle se trouvait après l'appel à initialize_board().
Sortie :
Board Initial Setup.
Enter the row and column number of the value to be entered into the board.
Row and Column indexes start at one, from top left corner.
Row: 1
Column: 1
Value: 4
Enter another value? (y/n): n
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
De plus, si j'entre d'autres coordonnées de matrice, c'est là que j'obtiens l'erreur de bus : output :
Board Initial Setup.
Enter the row and column number of the value to be entered into the board.
Row and Column indexes start at one, from top left corner.
Row: 5
Column: 5
Value: 5
Bus error: 10
Tout conseil sur la façon de nettoyer cette affreuse affaire de double getchar() serait également apprécié.
Merci à tous !
DEUXIÈME MODIFICATION Le problème venait de ces getchar()'s.... Je n'avais pas réalisé qu'ils retournaient un code ASCII entier pour représenter les nombres au lieu des nombres eux-mêmes. Voici ce que j'ai fait pour résoudre ce problème :
47 while(another == 'Y'){
48 valid=0;
49 while(!valid){
50 printf("\nRow: ");
51 row = getchar() - '0'; /* convert ASCII character code to actual integer value */
52 getchar(); /*added to remove extra newline character from stdin */
53 printf("Column: ");
54 col = getchar() - '0';
55 getchar(); /*remove \n */
56 printf("Value: ");
57 val = getchar() - '0';
58 getchar(); /*remove \n */
59 if(val >9 || val<1 || col>9 ||col<1 || row>9 || row<1)
61 printf("\nInvalid input, all values must be between 1 and 9, inclusive");
62 else
63 valid = 1;
64 }
65 board[row-1][col-1].value = val;
66 printf("Enter another value? (y/n): ");
67 another = toupper(getchar());
68 getchar(); /*remove \n */
69 }
Merci à tous pour votre aide et vos commentaires, je vais mettre en œuvre un grand nombre des suggestions que vous avez faites et j'ai beaucoup appris rien qu'en répondant à cette question !
TROISIÈME MODIFICATION
UNE DERNIÈRE QUESTION !
Bien que mon problème initial soit résolu, quelqu'un a-t-il une opinion ou un raisonnement solide sur la question de savoir s'il serait préférable d'implémenter la matrice en allouant dynamiquement la mémoire ?
Je me dis que je vais laisser les choses en l'état puisque ça marche, mais comme la matrice est assez grande, est-ce que ce ne serait pas une meilleure pratique de programmation que d'allouer dynamiquement ?