[c] structures matrices
Fermé
pedro7
-
17 déc. 2006 à 14:24
mamiemando Messages postés 33372 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 22 novembre 2024 - 18 déc. 2006 à 01:07
mamiemando Messages postés 33372 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 22 novembre 2024 - 18 déc. 2006 à 01:07
A voir également:
- Structure matrice en c
- Logiciel calcul structure bois gratuit - Télécharger - Architecture & Déco
- Afficher une matrice en c ✓ - Forum C
- Vous ne pouvez pas modifier une partie de matrice - Forum Excel
- Structure d'un rapport de stage - Guide
- Diagonale secondaire d'une matrice - Forum C
1 réponse
mamiemando
Messages postés
33372
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
22 novembre 2024
7 802
18 déc. 2006 à 01:07
18 déc. 2006 à 01:07
L'idée
En fait il serait mieux d'utiliser un int**. Je te rappelle qu'en C un int * est l'adresse d'un entier, et un int ** l'adresse d'une adresse associée à un entier. Concrètement le C propose une notation de type tableau (genre tab[i]), mais en fait c'est juste accèder à ce qui se trouve i entier plus loins que *tab (ie tab[0]) car ses entiers sont allouées de manière contigüe.
L'idée du int ** c'est que ton tableau int ** décrit un tableau de pointeurs (des int*), chacun des int* étant en réalité un tableau d'entier. Ainsi tu as un tableau de tableau d'entier. Tu notes au passages que ce concept peut permettre de décrire des tablmeaux 1D, 2D (des matrices) ou plus !
Rappel sur les pointeurs :
Un pointeur n'est qu'une variable qui fait la taille d'une adresse que ce soit un int * un void * un char ** ou un plop *. Ce qui est important c'est que cette adresse est un sens. C'est soit l'adresse d'un objet déjà créé en mémoire :
... soit un objet que tu alloues (et qu'il faudra désallouer avec un free). Par exemple pour allouer une plage en mémoire de n objet de type plop contigus en mémoire on tape :
A noter que calloc met toute la plage mémoire à 0.
La réponse à ton problème
Ok maintenant intéressons nous à l'allocation :
Ok il ne reste plus qu'à accedér à l'élément (i,j) :
En espérant t'avoir éclairé...
Bonne chance
En fait il serait mieux d'utiliser un int**. Je te rappelle qu'en C un int * est l'adresse d'un entier, et un int ** l'adresse d'une adresse associée à un entier. Concrètement le C propose une notation de type tableau (genre tab[i]), mais en fait c'est juste accèder à ce qui se trouve i entier plus loins que *tab (ie tab[0]) car ses entiers sont allouées de manière contigüe.
L'idée du int ** c'est que ton tableau int ** décrit un tableau de pointeurs (des int*), chacun des int* étant en réalité un tableau d'entier. Ainsi tu as un tableau de tableau d'entier. Tu notes au passages que ce concept peut permettre de décrire des tablmeaux 1D, 2D (des matrices) ou plus !
Rappel sur les pointeurs :
Un pointeur n'est qu'une variable qui fait la taille d'une adresse que ce soit un int * un void * un char ** ou un plop *. Ce qui est important c'est que cette adresse est un sens. C'est soit l'adresse d'un objet déjà créé en mémoire :
char c = 'x'; char *pc = &c;
... soit un objet que tu alloues (et qu'il faudra désallouer avec un free). Par exemple pour allouer une plage en mémoire de n objet de type plop contigus en mémoire on tape :
plop *p=(plop *)malloc(n*sizeof(plop)); ... // Quand je n'ai plus besoin de p : free(p);
A noter que calloc met toute la plage mémoire à 0.
La réponse à ton problème
Ok maintenant intéressons nous à l'allocation :
#include <stdio.h> #include <stdlib.h> struct matrix_t{ unsigned int nb_ligne; unsigned int nb_colonne; int **data; }; struct matrix_t new_matrix(unsigned int nb_ligne0,unsigned int nb_colonne0){ struct matrix_t m; unsigned int i; m.nb_ligne = nb_ligne0; m.nb_colonne = nb_colonne0; m.data = (int**)malloc(nb_ligne*sizeof(int *)); for(i=0;i<nb_ligne;++i){ // je mets les cases à 0 grâce au calloc m.data[i] = (int *)calloc(nb_colonne,sizeof(int)); } return m; } void delete_matrix(matrix * m){ unsigned int i; for(i=0;i<m.nb_ligne;++i) free(m.data[i]); free(m.data); free(m); }
Ok il ne reste plus qu'à accedér à l'élément (i,j) :
void set(struct matrix_t m,unsigned int ligne,unsigned int colonne,int val){ if (ligne >= m.nb_ligne){ fprintf(stderr,"set : out of range\n"); return; } if (colonne >= m.nb_colonne){ fprintf(stderr,"set : out of range\n"); return; } m.data[ligne][colonne] = value; } void get(struct matrix_t m,unsigned int ligne,unsigned int colonne,int val){ if (ligne >= m.nb_ligne){ fprintf(stderr,"get : out of range\n"); return; } if (colonne >= m.nb_colonne){ fprintf(stderr,"get : out of range\n"); return; } return m.data[ligne][colonne]; }
En espérant t'avoir éclairé...
Bonne chance