Parcours d'une matrice en C

clarabella 32 -  
mamiemando Messages postés 33778 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour,
je vous prie de me dire pourquoi ce petit pgm C ne donnent ps les bons résultats, je remplie ensuite j'affiche les éléments d'un tableau à 2 dimensions, mais je ne retrouve que les éléments de la dernière ligne de ma matrice, ou est l'erreur!!!!??? pourquoi les autres éléments sont écrasés??, aider moi avant que je ne perde la tête, voici la séquence et merci d'avance, bonne journée.

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{

int TpsOper[3][2];

int i,j;


for (i=0; i<3; i++)
{ for (j=0;j<2;j++)
{
printf("t[%ld,%ld]= ",i+1,j+1,i+1,j+1);
scanf("%ld",&TpsOper[i+1,j+1]);
printf("TpsOper[%ld,%ld]= %ld\n ",i+1,j+1, TpsOper[i+1,j+1]);

}
}
for (i=0; i<3; i++)
{
for (j=0;j<2;j++)
{
printf(" t[%ld,%ld]= ",i+1,j+1,i+1,j+1);

printf("TpsOper[%ld,%ld]= %ld\n ",i+1,j+1, TpsOper[i+1,j+1]); // j'ai essayé ac *nom du tableau
//mais c le même pblm!
}
}

system("PAUSE");
return 0;
}

2 réponses

loupius Messages postés 697 Date d'inscription   Statut Membre Dernière intervention   148
 
De la rigueur, de la rigueur ! Le compilateur doit se régaler ;-)
Avec ce code il n'y a pas de problème:
  int TpsOper[3][2];
  int i, j;

  for (i=0; i<3; i++)
    for (j=0; j<2; j++)
    {
      printf("t[%d,%d]= ", i+1, j+1);
      scanf("%d", &TpsOper[i][j]);
      printf("TpsOper[%d,%d] = %d\n", i+1, j+1, TpsOper[i][j]);
    }
Bonne réflexion.
0
mamiemando Messages postés 33778 Date d'inscription   Statut Modérateur Dernière intervention   7 884
 
J'ajouterais pour compléter qu'en C les "tableaux" sont indexés à partir de 0. En réalité, il n'y a pas de notino de tableau en C. Quand tu écris :

int tab[100];


.. tu alloues un bloc mémoire de 100 fois la taille en mémoire d'un entier (32 bits typiquement). Ce bloc est crée à une adresse mémoire enregistrée dans la variable tab. Cette adresse est un int * (cette écriture signifie : ce qui se trouve à cette adresse est un entier). À cette adresse se trouve le premier entier stocké dans le tableau. Ce qu'il faut bien comprendre, c'est que le fait d'écrire ...

tab[10]


... ou encore ...

*(tab+10) // cette écriture équivaut à tab[10]


... signifie que tu prends l'adresse de tab, comme c'est une adresse de type int *, on peut ajouter 10 ce qui revient à se décaler de 10 * 32bits en partant de tab. À cette adresse est stocké le 11ème entier du tableau. En effet, car *tab, ou encore *(tab + 0), ou encore tab[0] stocke le premier entier du tableau (cf paragraphe précédent). C'est pourquoi un "tableau" en C est indexé à partir de 0.

À noter qu'un compilateur ne peut à aucun moment deviner quel entier tu veux manipuler, et c'est pourquoi il ne dit rien quand tu écris tab[i+1].

Bonne chance
0