Rechercher : dans
Par :

[c] structures matrices

Dernière réponse le 18 déc 2006 à 01:07:29 pedro7, le 17 déc 2006 à 14:24:40 
 Signaler ce message aux modérateurs

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

Configuration: Windows 2000
Internet Explorer 6.0

Meilleures réponses pour « [c] structures matrices » dans :
Les structures en langage C Voir Différence entre une structure et un tableau Un tableau permet de regrouper des éléments de même type, c'est-à-dire codés sur le même nombre de bits et de la même façon. Toutefois, il est généralement utile de pouvoir rassembler des éléments de...
Les structures en langage C++ Voir Différence entre une structure et un tableau Un tableau permet de regrouper des éléments de même type, c'est-à-dire codés sur le même nombre de bits et de la même façon. Toutefois, il est généralement utile de pouvoir rassembler des éléments de...
Les files en langage C VoirLes files - Premier Entré Premier Sorti Requis I. INTRODUCTION II. Définition III. La construction du prototype d'un élément de la file IV. Opérations sur les files A. Initialisation B. Insertion d'un élément dans la file C. Oter un...
Les piles en langage C VoirLes piles Requis I. INTRODUCTION II. Définition III. La construction du prototype d'un élément de la pile IV. Opérations sur les piles A. Initialisation B. Insertion d'un élément dans la pile C. Ôter un élément de la pile D. Affichage...
Structure logique d'un disque dur VoirStructure logique d'un disque dur Introduction Lorsque vous utilisez votre ordinateur, vos données sont organisées sous forme de fichiers et de répertoires, selon une structure arborescente et ces éléments sont stockés sur votre disque dur. C'est...
Langage C - Les structures conditionnelles VoirQu'est-ce qu'une structure conditionnelle ? On appelle structure conditionnelle les instructions qui permettent de tester si une condition est vraie ou non. Ces structures conditionnelles peuvent être associées à des structures qui se répètent...
Langage C++ - Les structures conditionnelles VoirQu'est-ce qu'une structure conditionnelle ? On appelle structure conditionnelle les instructions qui permettent de tester si une condition est vraie ou non. Ces structures conditionnelles peuvent être associées à des structures qui se répètent...
Langage C - Les listes chaînées VoirLa notion de structure autoréferrentielle Une structure autoréferrentielle (parfois appelée structure récursive) correspond à une structure dont au moins un des champs contient un pointeur vers une structure de même type. De cette façon on crée...

1

 mamiemando, le 18 déc 2006 à 01:07:29
  • +2

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

Répondre à mamiemando