Rechercher : dans
Par :

Aide Structure en C

Dernière réponse le 11 nov 2006 à 17:55:07 ad, le 8 nov 2006 à 17:16:13 
 Signaler ce message aux modérateurs

Bonjour,
voila g un gros prob d'allocation memoire pour un tableau double champ situé ds une sructure.

G definit ma structure ds un fichier .h de la facon suivante :

typedef struct image_N
{
int **tableau;
}image_N

image_N saisie( );

puis ds mon fichier c
je definis ma sous fonction

image_N saisie( )
{
image_N i;

i.tableau = (int**) malloc ( 5 * sizeof (int*));
return(i)

}

Lors de la compilation le compilateur m'indique a la ligne ou j'alloue la mémoire que j'ai un probleme d'assignation de type incompatible...

Pourriez vous m'aider a resoudre ce proble urgent svp...
Merci bcp d'avance

Meilleures réponses pour « aide Structure en C » 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 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...
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 templates en C++ VoirIntroduction Avantages Inconvénients Quand utiliser des templates ? Que dois-je mettre dans les .hpp et dans les .cpp ? Convention de notations Quelques templates célèbres STL BGL Premiers pas Spécifications de templates Template par...
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...
Les constructeurs et les destructeurs en langage C++ VoirLa notion de constructeur Le constructeur est la fonction membre appelée automatiquement lors de la création d'un objet (en statique ou en dynamique). Cette fonction membre est la première fonction membre à être exécutée, il s'agit donc d'une...
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...

1

lami20j, le 8 nov 2006 à 19:29:14

Salut,

en attendant l'aide des personnes beaucoup, beaucoup plus experimentées en regardant ton code j'ai déjà remarqué des erreurs

typedef struct image_N
{
int **tableau;
}image_N


Pour la déclaration des structures tu peux faire

struct image_N {
   int **tableau;
};
ou avec typedef
typedef struct {
   int **tableau;
}image_N;
Il ne faut pas oublier le point-virgule à la fin

En ce qui concerne l'allocation de la mémoire il faut plutôt quelque chose de genre
(struct image_N *) malloc( 5 * sizeof(struct image_N) )
lami20j

Répondre à lami20j

2

kij_82, le 8 nov 2006 à 20:30:46

Pour ce qui est de la déclaration de la structure, ce qui as été donné par lami20j est bon :

typedef struct {
   int **tableau;
}image_N;


ou

typedef struct image_N {
   int **tableau;
};


Et dans ta fonction par contre, je dirais plus un truc dans le genre :
image_N saisie( )
{
image_N i;

i = (struct image_N *) malloc(  sizeof(struct image_N) );
i.tableau = (int**) malloc ( 5 * sizeof (int*));

return(i)

}

~ iclic @ gauch,iclic, iclic @ droate, iclic, iclic
et ya pas de bôg môsieu ! ~

Répondre à kij_82

3

adibou, le 8 nov 2006 à 22:58:58

Je te remercie pour ta reponse j'ai fait ce que tu me propose mais il me sort toujour la meme erreur...


j'ai oublié de préciser( je sais pas si sa change quelque chose ) que dans ma structure je definis 2 autres variable de type int..j'espere que sa influ pas...

Je voudrais savoir quel etait le role de ta commande

i = (struct image_N *) malloc( sizeof(struct image_N) );

j'ai l'impression que tu alloues de la memoire a la structure mais pk et combien puisqu'elle n'est pas encore définit...

merci comme meme pour votre aide ;)

Répondre à adibou

4

kij_82, le 9 nov 2006 à 09:32:41

Tu alloue déjà de la mémoire à ta structure (qu'elle contienne en plus des entier ou autre n'est pas un probleme), puis ensuite, puisque tu as un pointeur sur pointeur d'entier, il faut aussi que tu l'alloue. D'ou le fait d'allouer déjà la structure, puis chacun des composants (pointeur). Pour ce qui est des autres types simple faisant parti de ta structure, leur place sera allouée lors de l'allocation de la structure.

Par contre, tu inclu bien ton fichier.h au moins dans ton .c ?!

Parce que sinon c'est normal qu'il ne te le reconnaisse pas.

Pour inclure ton .h :

#include <./mon.h>

Enfin... la déclaration je confonds peut etre avec php a force... ^^
Je pense que ca ne te le reconnais pas parce que ton 'i' n'est pas un pointeur dans ta fonction, donc met une * juste avant ton i (et de meme pour le retour de la fonction si je me souviens bien :

image_N * saisie( )
{
image_N * i;

i = (struct image_N *) malloc(  sizeof(struct image_N) );
i->tableau = (int**) malloc ( 5 * sizeof (int*));

return(i)

}


~ iclic @ gauch,iclic, iclic @ droate, iclic, iclic
et ya pas de bôg môsieu ! ~

Répondre à kij_82

5

mamiemando, le 9 nov 2006 à 20:39:57

Il faut allouer aussi chaque case des tableaux 1D

#include <stdlib.h>

struct matrix2d_t{
  unsigned int nb_ligne;
  unsigned int nb_colonne;
  int **data;
};

matrix2d_t new_matrix2d(
  unsigned int nb_lig,
  unsigned int nb_col
){
  matrix2d_t m;
  unsigned int i;
  m.data = (int **) malloc(nb_lig*sizeof(int *));
  for(i=0;i<nb_lig;++i){
    m.data[i] = (int *) malloc(nb_col * sizeof(int)); //alloc tableau 1d
  }
  m.nb_ligne = nb_lig;
  m.nb_colonne = nb_col;
  return m;
}

void del_matrix(matrix2d * m){
  unsigned int i,nb_lig=m.nb_ligne;
  for(i=0;i<nb_lig;++i){
    free(m->data[i]);
  }
  free(m->data);
  free(m);
}



ou quelque chose de ce goût là...

Bonne chance

Répondre à mamiemando

7

lami20j, le 11 nov 2006 à 17:06:56

Salut,

merci pour le cours ;-))

lami20j

Répondre à lami20j

6

kij_82, le 10 nov 2006 à 17:17:54

Bien vu ^^
~ iclic @ gauch,iclic, iclic @ droate, iclic, iclic
et ya pas de bôg môsieu ! ~

Répondre à kij_82

8

 kilian, le 11 nov 2006 à 17:55:07

Vouich, je crois que si l'on oublie d'inclure stdlib.h pour malloc on peut avoir des erreurs de ce type.

..et le...le...enfin, non parce c'est...ya...quand...bah tu sais là le...

Répondre à kilian