Parcours d'une matrice en C

Fermé
clarabella 32 - 20 déc. 2009 à 01:27
mamiemando Messages postés 33446 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 20 décembre 2024 - 20 déc. 2009 à 02:42
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 dimanche 1 novembre 2009 Statut Membre Dernière intervention 31 décembre 2017 148
20 déc. 2009 à 01:44
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 33446 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 20 décembre 2024 7 812
20 déc. 2009 à 02:42
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