[c] structures matrices

Fermé
pedro7 - 17 déc. 2006 à 14:24
mamiemando Messages postés 33077 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 18 avril 2024 - 18 déc. 2006 à 01:07
C : structure matrices

Salut tout le monde!
Je voulais savoir, quand on cree une structure telle que :

typedef struct
{
int* m; //matrice
int taille; //nb de colonne de la matrice
} T_carre;

par exemple

et qu'on veut ensuite dans une fonction utiliser la matrice de T_carre dans un printf par exemple...

Que dois je ecrire car vu que c'est defini comme un pointeur :
moncarre.m[i] ne semble pas marcher...

void afficher_matrice (T_carre moncarre)
{
int i;

for (i=0;i<(moncarre.taille*moncarre.taille);i++)
{printf("%d ",moncarre.m[i]);
if (i!=0 && (i+1)%(moncarre.taille)==0) {printf("\n");} //les retours a la lignes

}

}


merci de m'avoir lu

1 réponse

mamiemando Messages postés 33077 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 18 avril 2024 7 748
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 :
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
11