[C] Matrice de structures : probleme de remplissage

Matrice de structures : probleme de remplissage [C] - C - Programmation

Marsh Posté le 05-05-2009 à 12:35:14    

Voila, j'essaie de faire un tableau à deux dimensions de structures.
Le probleme c'est que quand je remplis une case, toutes les lignes prennent la même valeur.
 
Voyez vous même :

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. struct bloc
  5. {
  6. int nord,sud,est,ouest;
  7. }  ;
  8. int main(void)
  9. {
  10.   // on demarre le randomisateur (lol)
  11.   srand(time(NULL));
  12.   //Hope, deux trois variables
  13.   int lo=0;
  14.   int la=0;
  15.   int i,j;
  16.  
  17.  
  18.   // Dédale ou 3-5ans ?   
  19.   printf("Longueur du labyrinthe ? " );
  20.   scanf("%d",&lo);
  21.   printf("Largeur du labyrinthe ? " );
  22.   scanf("%d",&la);
  23.  
  24.   // informaticiens : debut = 0, Humains : debut = 1
  25.   lo--;
  26.   la--;
  27.  
  28.   //Et hop ! Labyrinthe créé
  29.   struct bloc laby[la][lo];
  30.   // on met tout à 0
  31.   for(j=0;j<=lo;j++)
  32.   {
  33.       for(i=0;i<=la;i++)
  34.       {
  35.         laby[i][j].nord=0;
  36.         laby[i][j].ouest=0;
  37.         laby[i][j].est=0;
  38.         laby[i][j].sud=0;
  39.       }
  40.   }
  41.            laby [1][2].nord=2;
  42.            laby [1][3].ouest=4;
  43.            laby [2][0].est=6;
  44.            laby [2][3].sud=8;
  45. // on affiche tout :
  46.   printf("modele : [n,e,s,o] \n" );
  47.   for(j=0;j<=lo;j++)
  48.   {
  49.       for(i=0;i<=la;i++)
  50.       {
  51.         printf("(%d,%d)[%d,%d,%d,%d]\t",i+1,j+1,laby[i][j].nord,laby[i][j].est,laby[i][j].sud,laby[i][j].ouest);
  52.       }
  53.       printf("\n" );
  54.   }
  55. //...


 
Et avec ça j'ai toutes mes "lignes" identiques...
D'où vient le probleme ?
 
merci d'avance

Reply

Marsh Posté le 05-05-2009 à 12:35:14   

Reply

Marsh Posté le 05-05-2009 à 12:39:56    

struct bloc laby[la][lo];
...
for(j=0;j<=lo;j++)
...

Il y a un problème d'indice. Il faut déclarer lo+1 (idem pour la) ou bien faire une boucle avec "<" au lieu de "<=".
Je ne sais pas si le problème vient de là. En tous cas, c'est un problème.

Reply

Marsh Posté le 05-05-2009 à 12:41:59    

Ben non, sinon le programme m'affiche une matrice 2*2 alors que je demande une 3*3.
Tu as vu le :

Code :
  1. lo--;
  2. la--;

?
Bizarrement, je n'ai pas ce probleme avec une matrice 2*2


Message édité par kwaio le 05-05-2009 à 12:43:45
Reply

Marsh Posté le 05-05-2009 à 12:44:46    

Les moins moins ne sont pas placés au bon endroit. Il aurait fallu les mettre juste après la déclaration, pas avant. Mais le plus simple et le plus habituel est de ne pas avoir de moins moins, mais de faire un test inférieur strictement au lieu de ce inférieur ou égal.


Message édité par olivthill le 05-05-2009 à 12:46:31
Reply

Marsh Posté le 05-05-2009 à 12:56:37    

Certes mais le problème n'est pas là, si ?
 
Mon "remplissage de case" est bien syntaxé ?

Reply

Marsh Posté le 05-05-2009 à 13:00:59    

Comme je l'ai dit, je ne sais pas si le problème est là ou pas. Je sais juste qu'un débordement est un problème grave, qu'il faut traiter en premier lieu.
 
Pour ce qui est de la syntaxe, il faut voir s'il y a des messages d'erreur ou d'avertissement à la compilation.

Reply

Marsh Posté le 05-05-2009 à 13:07:12    

aucun, non
 
pour le débordement, j'ai pas bien compris ce que je suis sensé faire...
faire  

Code :
  1. scanf("%d",&lo);
  2. ...
  3. bloc laby [lo-1][la-1];
  4. ...
  5. for (i=0;i<la;i++)
  6. ...


 
??

Reply

Marsh Posté le 05-05-2009 à 13:35:07    

bloc laby [lo-1][la-1];

Aie. Non, il faut tout simplement

bloc laby [lo][la]


Vérifions en comptant (et pour simplifier, je ne considère qu'une dimension) : Si lo = 3. Avec une boucle for(i= 0; i < 3; i++) cela donne 0, 1, 2. Donc 3 remplissages pour un tableau ayant trois cases.

Reply

Marsh Posté le 06-05-2009 à 00:13:34    

Ah oui, exact.
Ca a l'air de résoudre le probleme...


Message édité par kwaio le 06-05-2009 à 00:17:34
Reply

Marsh Posté le 06-05-2009 à 00:56:43    

Merci =)
 

Reply

Sujets relatifs:

Leave a Replay

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