[c] structures matrices
Fermé
pedro7
-
17 déc. 2006 à 14:24
mamiemando Messages postés 33654 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 mai 2025 - 18 déc. 2006 à 01:07
mamiemando Messages postés 33654 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 mai 2025 - 18 déc. 2006 à 01:07
A voir également:
- Structure matrice en c
- Logiciel calcul structure bois gratuit - Télécharger - Architecture & Déco
- Vous ne pouvez pas modifier une partie de matrice - Forum Excel
- Dans la table des matières du document à télécharger, le chapitre 6 et ses 2 sections n'apparaissent pas. trouvez l'erreur dans la structure du document et corrigez-la. mettez à jour la table des matières. quel est le mot formé par les lettres en majuscules de la table des matières après sa mise à jour ? - Forum Word
- Structure d'un rapport de stage - Guide
- Pas modifier une partie de matrice - Forum Excel
1 réponse
mamiemando
Messages postés
33654
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
4 mai 2025
7 846
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