Salut à tous, n'ayant pas trouvé de réponse dans la FAQ je lance ma question en discussion.
Pour mes besoins personnels, à savoir de la manipulation de matrices, je tente de me créer des fonctions qui simplifient la vie (genre initmatrix pour initialiser, printmatrix pour afficher...).
Vu que ces fonction prennent une matrice en argument, je leur déclare comme 1r argument du (int** matrice, ...).
1)Dans mon main, je déclarais au début naïvement
Sauf que là je me fais insulter par le compilateur. Je ne vois toujours pas bien pourquoi. Surtout que pour des tableaux "simples", d'entiers quoi, ca se passait bien.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 int matrice[5][6] ; /*par exemple...*/ initmatrix (matrice,5,6,0); /*le 0 c'est ce qu'affecte la fonction partout*/
2)Je ruse et je déclare dans le mainque je fais suivre par une allocation manuelle classique. J'appelle alors initmatrix(matrice,taille1,taille2,valeurdebase) ou printmatrix et tout se passe bien.
Code : Sélectionner tout - Visualiser dans une fenêtre à part int** matrice ;
Par flemme et par souci de lisibilité je me dis que c'est moche de faire tout ça dans le main, j'écris une fonction allocmatrix, de façon à n'avoir qu'à écrire dans le main
Il va de soi que ca plante ... Grosso modo à ce stade le problème c'est que allocmatrix fait son job sans histoires mais à la sortie elle n'a rien fait sur matrice ... Je met ici le code de tout ca pour que vous y voyiez plus clair :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 int** matrice; allocmatrix(matrice,taille1,taille2); /*en supposant les entiers taillei définis avant*/ initmatrix(...)
Voilà l'endroit où ca plante est indiqué.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64 /* ***La fonction allocmatrix*** allocmatrix(matrix,p,q) donne une taille p,q à la matrice */ void allocmatrix (int** matrix, int taille1 , int taille2) { matrix = (int**)malloc(taille1 * sizeof(int*)) ; int k ; for(k=0; k<=(taille1-1);k++) { *(matrix + k)=(int*)malloc(taille2 * sizeof(int)); printf("Valeur matrix[%d][0]= %d \n",k,matrix[k][0]); system("PAUSE"); } } int main () { /*Prototypage*/ void initmatrix (int**,int,int,int); void printmatrix (int**,int,int); void allocmatrix (int**,int,int) ; /*Fin prototypage*/ int taille1 = 5 ; int taille2 = 4 ; printf("ok ca va \n"); system("PAUSE"); /*Creation d'une matrice*/ int** matrix; allocmatrix(matrix,taille1,taille2) ; /* matrix = (int**)malloc(taille1 * sizeof(int*)) ; int k ; for(k=0; k<=(taille1-1);k++) { matrix[k]=(int*)malloc(taille2 * sizeof(int)); } */ printf("je vais essayer d'acceder a matrix[1][0]\n"); system("PAUSE"); printf("matrix[1][1]=%d\n",matrix[1][0]); /*C'est LA que ca plante, because je suis hors matrice semble t-il*/ printf("j'aimerais bien etre affiche un jour, si ca pouvait ne pas bugger...\n"); system("PAUSE"); /*En fait ce qui est problématique c'est qu'en fait au sortir de la fonction allocmatrix, qui s'execute sans histoires, matrix n'a pas grandi ... qqch se fait en local chez allocmatrix mais pas sur l'argument... c zarb qd on regarde ma fonction initmatrix construite sur le même modèle et qui pourtant marche Si je fais moi même les choses dans le main, cad si je fais executer le bloc de code mis en commentaire et que je n'appelle pas allocmatrix et ben là ca marche.*/ initmatrix (matrix,taille1,taille2,0); printmatrix (matrix,taille1,taille2) ; system("PAUSE"); return(0); }
Evidemment ca ressemble fort aux ennuis qu'on a quand on passe par valeur un param qui doit être modifié.
Sauf que initmatrix lui n'a aucun problème pourvu que la matrice soit allouée dans le main avec les lignes que j'ai mises de coté par commentaire.
Sauf que si j'ai bien compris, un tableau EST un pointeur donc je ne vois pas pourquoi ca ne se passe pas bien avec les matrices.
Sauf qu'en essayant de passer en param &matrix , en ayant bien sûr déclaré le premier argument de alllocmatrix comme un int***, et en ayant remplacé toutes les occurences de matrix par *matrix dans le code de allocmatrix. Eh ben pout tout vous dire ca plante encore plus tôt. Au moment d'allouer matrix[1] en fait. Ca c'est une autre histoire ...
Alors si quelqu'un peut répondre à mes 2 problèmes (le 2 surtout ... histoire d'avoir enfin cette satanée fonction d'alloc) je lui en serais très reconnaissant.
Si vous voulez le code de initmatrix ou printmatrix pour voir, ou toute autre précision pas de problème.
Pour info, niveau compilateurs, j'utilise DevC++ sur mon ordi sous Windows et gcc sur les linux de mon école.
Partager