Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
693 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Matrice de struct en paramètre

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Matrice de struct en paramètre

n°2073766
Phil31700
Posté le 04-05-2011 à 13:51:50  profilanswer
 

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.

mood
Publicité
Posté le 04-05-2011 à 13:51:50  profilanswer
 

n°2073778
shaoyin
Posté le 04-05-2011 à 14:31:34  profilanswer
 

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

n°2073783
Phil31700
Posté le 04-05-2011 à 14:48:21  profilanswer
 

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...

n°2073787
shaoyin
Posté le 04-05-2011 à 14:57:12  profilanswer
 

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
n°2073788
gilou
Modérateur
Modzilla
Posté le 04-05-2011 à 14:58:17  profilanswer
 

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é!  --
n°2073790
shaoyin
Posté le 04-05-2011 à 15:00:56  profilanswer
 

:sol:

n°2073801
tpierron
Posté le 04-05-2011 à 15:31:34  profilanswer
 

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
n°2073865
Phil31700
Posté le 04-05-2011 à 17:08:18  profilanswer
 

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 ?

n°2073870
Paulp
~, sweet ~
Posté le 04-05-2011 à 17:13:38  profilanswer
 
n°2073871
tpierron
Posté le 04-05-2011 à 17:19:58  profilanswer
 

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...

mood
Publicité
Posté le 04-05-2011 à 17:19:58  profilanswer
 

n°2073877
Phil31700
Posté le 04-05-2011 à 17:38:55  profilanswer
 

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
n°2073897
theshockwa​ve
I work at a firm named Koslow
Posté le 04-05-2011 à 19:43:49  profilanswer
 

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
n°2073898
Phil31700
Posté le 04-05-2011 à 19:52:43  profilanswer
 

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 !


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Matrice de struct en paramètre

 

Sujets relatifs
passage de parametreVBA - Créer une matrice à partir d'une ListBox Multiple
BufferedImage a passer en parametre[C#] enum et struct
resolution d'une matrice par la methode de gaus sur Matlab[MATH] Matrice de projection d'un point sur un plan
[SQL SERVER 2008] : Parametre OUTPUT qui sort pasRotation d’une matrice en Python
[MySQL / PL/SQL] Selection passée en paramètre[résolu] Paramètre POST dans une ligne de commande wget
Plus de sujets relatifs à : Matrice de struct en paramètre


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR