Matrice de struct en paramètre

Matrice de struct en paramètre - C - Programmation

Marsh Posté le 04-05-2011 à 13:51:50    

Bonjour à tous !
Après avoir essayé plusieurs formulations (de plus en plus "foireuses", je dois le reconnaitre), je me décide à venir demander de l'aide ici même.
Je suis en 1e année d'IUT informatique, et nous avons un projet à faire en C. Jusque là, rien de bien surprenant.
Ce qui me bloque vient d'un sous-programme à priori tout bête, mais je n'arrive pas à voir d'où vient mon erreur.
 
Voici donc  le code qui me pose problème :  

Code :
  1. #define K_NBCASES 25
  2. //Les deux définitions de structures :
  3. typedef struct
  4.     {
  5.        int coordX;
  6.        int coordY;
  7.        int contenu;
  8.     }Tcase;
  9. typedef struct
  10.     {
  11.         Tcase cellule;
  12.     }Tdamier;
  13. //La fonction qui me pose problème :
  14. Tdamier initDamier(void)
  15. {
  16.     int i,j;
  17.     Tdamier damier[K_NBCASES][K_NBCASES];
  18.     for(i=0;i<K_NBCASES;i++)
  19.     {
  20.         for(j=0;j<K_NBCASES;j++)
  21.         {
  22.             damier[i][j].cellule.coordX=i;
  23.             damier[i][j].cellule.coordY=j;
  24.             damier[i][j].cellule.contenu=0;
  25.         }
  26.     }
  27.     return damier;
  28. }
  29. // L'appel dans le main :
  30.     damier=initDamier();


 
Le but de la fonction est donc d'initialiser un damier, représenté par une matrice, puis de le retourner et de le récupérer dans une variable adaptée dans le main.
Lors de la compilation, j'ai le message d'erreur suivant (sous Code::Blocks) : "error : incompatible types in return".
Pourtant, on traite bien une structure Tdamier, et on la retourne. J'ai donc beau me creuser la tête, je ne vois pas d'où vient l'erreur. N'ayant jamais manipulé de matrices avant, cela vient probablement de là...
 
Help !
Et merci de m'avoir lu.

Reply

Marsh Posté le 04-05-2011 à 13:51:50   

Reply

Marsh Posté le 04-05-2011 à 14:31:34    

Dans 'initDamier', la variable 'damier' est de type Tdamier **. C'est peut-être là le hic ?

Reply

Marsh Posté le 04-05-2011 à 14:48:21    

Mais encore ?
Damier est bien une matrice, jusque là d'accord, et dans le main aussi.
C'est probablement de là que vient l'erreur, mais je ne vois toujours pas comment le corriger...

Reply

Marsh Posté le 04-05-2011 à 14:57:12    

je veux dire que ta fonction initDamier retourne un type damier, pas un damier **. L'incompatibilité de type vient sûrement de là.


Message édité par shaoyin le 04-05-2011 à 14:59:15
Reply

Marsh Posté le 04-05-2011 à 14:58:17    

Et c'est quoi le type de retour de initDamier?
EDIT: Grilled
A+,


Message édité par gilou le 04-05-2011 à 14:58:42

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 04-05-2011 à 15:00:56    

:sol:

Reply

Marsh Posté le 04-05-2011 à 15:31:34    

Quel que soit le type de la variable "damier", retourner une variable locale depuis une fonction = corruption de pile. Dans initDamier, il faut soit passer par malloc, ou déclarer la matrice dans la fonction main() et la transmettre à initDamier.
 
Edit:  [:tinostar] ou déclarer la matrice "static".


Message édité par tpierron le 04-05-2011 à 15:32:43
Reply

Marsh Posté le 04-05-2011 à 17:08:18    

Re-bonjour !
Déjà merci pour ces réponses.
 
Bon, j'ai donc tenté une autre approche :
 

Code :
  1. //La fonction :
  2. void initDamier(Tdamier damier[][])
  3. {
  4.     int i,j;
  5.     for(i=0;i<K_NBCASES;i++)
  6.     {
  7.         for(j=0;j<K_NBCASES;j++)
  8.         {
  9.             damier[i][j].cellule.coordX=i;
  10.             damier[i][j].cellule.coordY=j;
  11.             damier[i][j].cellule.contenu=0;
  12.         }
  13.     }
  14. }


 
Oh ! Nouveau message d'erreur !
"error: invalid use of array with unspecified bounds"
(sur les trois lignes de traitement).
Des idées de correction ?

Reply

Marsh Posté le 04-05-2011 à 17:13:38    

Reply

Marsh Posté le 04-05-2011 à 17:19:58    

Code :
  1. void initDamier(Tdamier damier[][K_NBCASES])
  2. {
  3.    /* ... */
  4. }


 
T'expliquer pourquoi reviendrais à te faire un cours quasi complet sur le fonctionnement des tableaux en C, chose que tu aurais du voir en cours...

Reply

Marsh Posté le 04-05-2011 à 17:19:58   

Reply

Marsh Posté le 04-05-2011 à 17:38:55    

Bon, soit. Ta méthode a au moins le mérite de fonctionner.
Nous avons effectivement vu les tableaux en cours, mais jamais les tableaux à plusieurs dimensions, qui sont tout de même sensiblement différents apparemment.

 

Mais bon, comme ça marche, je me contenterai de ça (si l'explication est trop longue).

 

Merci, donc...


Message édité par Phil31700 le 04-05-2011 à 19:53:02
Reply

Marsh Posté le 04-05-2011 à 19:43:49    

bonjour la logique, par contre ... Tu vas avoir K_NBCASES * K_NBCASES  cases au total, qui seront à des coordonnées dupliquées àl'intérieur de chaque case ... C'est pas forcément utile.
 
Ce serait sans doute simplifié si tu faisais un tableau style

Code :
  1. int tab[NB_LIGNES][NB_COLONES];// accès direct à la valeur


 
ou encore, pour éviter de te poser des questions sur les tableaux à deux dimensions, une structure correspondant à une ligne :

Code :
  1. struct Ligne
  2. {
  3.   int elements[NB_COLONES];
  4. };
  5. struct Damier
  6. {
  7.   Ligne lignes[NB_LIGNES];
  8. };


---------------
last.fm
Reply

Marsh Posté le 04-05-2011 à 19:52:43    

Bonsoir !
@theshockwave :
Le tableau dont je me sers (à deux entrées) fait 25x25, d'où le seul K_NBCASES (pour reprendre ton exemple, NB_LIGNES==NB_COLONNES).
 
Par contre, j'aime assez ton autre solution, je vais regarder ça ce soir, voir si ça me parait plus logique...
 
Merci à vous !

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed