Go Down

Topic: boucle for et struct ... (Read 1 time) previous topic - next topic

victorberson94

May 13, 2019, 12:23 pm Last Edit: May 13, 2019, 12:27 pm by victorberson94
Bonjour,

J'ai développé un petit code qui doit attribuer des valeurs à un tableau de structure.
Quand je regarde le port série, tout marche parfaitement sauf la dernière valeur et je ne comprend pas pourquoi.
Si quelqu'un comprend je veux bien une piste s'il vous plait !
Merci d'avance

Code: [Select]
typedef struct T_obs
{
  int posY;
  int posX;
  int taille; 
};
T_obs chemin[32];

void loop() {
  Serial.println("INITIALISATION");
  chemin[0].posX = 0;
  chemin[0].posY = 5;
  chemin[0].taille = 6;
  for(int i=1;i<=32;i++)
  {
    chemin[i].posX = -i;
    Serial.print(" X = ");
    Serial.print(chemin[i].posX);

    chemin[i].posY = chemin[i-1].posY + random(-1,2);
    chemin[i].taille = 6;
    if(chemin[i].posY < 0)
    {
      chemin[i].posY = 0;
    }
    if(chemin[i].posY > 15 - chemin[i].taille)
    {
      chemin[i].posY = 15 - chemin[i].taille;
    }
    Serial.print(" - Y = ");
    Serial.println(chemin[i].posY);
  }
  Serial.println("FIN INITIALISATION");
}

fdufnews

#1
May 13, 2019, 12:27 pm Last Edit: May 13, 2019, 12:29 pm by fdufnews
Code: [Select]
T_obs chemin[32];
Code: [Select]
for(int i=1;i<=32;i++)
Comme le tableau est dimensionné pour 32 éléments, il faut s'arrêter à 31 lorsque tu adresses celui-ci. Les éléments allant de 0 à 31.
Code: [Select]
for(int i=1;i<32;i++)

dbrion06

Pour votre malheur, et contrairement à toute logique, les tableaux de c (++) ont un indice commençant à 0 et finissant à Taille -1 (Fortran, Pascal et R ont une gestion intuitive des indices).
Votre code fait donc comme si votre tableau de structures avait 33 records (0 en dehors d'une boucle, .... jusqu'à 32); or, il est déclaré de taille 32: ceci est pour le moins une bug...

victorberson94

Merci pour vos réponses, ca marche super maintenant !

gosselien

Et ceci ?

for(int i=0;i<33;i++) peut être puisque on commence toujours à zéro :)

biggil

Pour votre malheur, et contrairement à toute logique, les tableaux de c (++) ont un indice commençant à 0
Ca, c'est une opinion subjective :D

dbrion06

Cette subjectivité a été partagée par les concepteurs de Fortran et Pascal -qui ont poussé le dévouement jusqu'à permettre de commencer les indices de tableaux à .... n'importe quelle valeur).
Pour info, C était un successeur de A (un assembleur), B§ (une chose qui a gagné à rester inconnue).... La qualité des langages informatiques est donc une fonction croissante de leur ordre alphabétique, suivant la logique des fabricants de C (++)...

hbachetti

Heu ... très subjectif en effet. En PYTHON, qui est un langage récent, les tableaux sont indexés comme en C.
Preuve que ce n'est pas si illogique.
Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

dbrion06

Ceci n'est pas une preuve logique (si tout ce qui était récent était supérieur à l'ancien, faudrait cramer toutes les cathédrales, transformer les musées en Apple stores)

hbachetti

Comme on l'a dit c'est très subjectif. Et dire que Fortran et Pascal sont plus logique est faux aussi.
Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

dbrion06

Fortran, Pascal et R (créé 20 ans après C.... il existe des progrès)  sont plus faciles d'emploi (je suis obligé, à chaque fois que je lis du C, de me rememorer que le premier élément est à l'indice zero... et ainsi de suite). Il y a la possibilité, sur PC et C++, d'iterer sur les elements d'un tableau/vecteur  sans passer par l'indice, mais je dois retrouver l'astuce (https://stackoverflow.com/questions/2395275/how-to-navigate-through-a-vector-using-iterators-c à chaque fois... python est muni aussi de cette possibilité.

hbachetti

#11
May 13, 2019, 01:59 pm Last Edit: May 13, 2019, 02:02 pm by hbachetti
Quote
Fortran, Pascal et R (créé 20 ans après C.... il existe des progrès)  sont plus faciles d'emploi
Pourquoi JAVA, PYTHON, RUBY n'ont-ils pas repris les principes Fortran et Pascal dans ce cas ?

En python on a toutes les possibilités, y compris range() mais un tableau commence à l'indice zéro.

Code: [Select]

array = ('zero', 'one', 'two')

print array[0]
for s in array :
print s,
print
for n in range(10) :
print n,
print
for n in range(1, 10) :
print n,
print
for n in (0, 1, 3, 5, 6, 7, 9, 10) :
print n,
print

sortie :

zero
zero one two
0 1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
0 1 3 5 6 7 9 10



Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

hbachetti

Quels-sont-les-langages-de-programmation-les-plus-utilises-par-les-developpeurs-Une-analyse-des-evenements-publics-sur-GitHub/

C++ et C restent 4è et 5è langages les plus utilisés dans le monde, Fortran et Pascal disparaissent des statistiques.
Pour moi qui développe en PYTHON, JavaScript, PHP, C et C++, tant mieux s'il y a des ressemblances.
Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

dbrion06

Pour un langage semi interprété, accéder aux elements d'un tableau par des indices (python, comme R, a "in") n'est pas optimum.
R, dans un souci de simplicité (pas la peine d'accèder au deuxième élément d'un tableau tab par tab[1]....) a choisi les conventions Fortran et Pascal (et l'argument "d'autres le font, donc c'est bien" n'a pas de valeur historique : ex: l'Anschluss de 1938, qui a été très populaire).
Je pense que les auteurs de Python, Java et ruby ont voulu
a) affirmer leur supériorité, en imposant un indiçage contre intuitif
b) punir les débutants (qui font assez de sottises comme ça avec les indices).
c) décourager l'indexage....
Par contraste, Fortran et Pascal permett{,ai}ent aux utilisateurs de débuter leurs tableaux .... où ils voulaient, en privilégiant l'indexage naturel.

hbachetti

Quote
simplicité, supériorité, indiçage contre intuitif, indexage naturel
Tout ceci n'engage que toi. Tous les mots que tu emploies sont subjectifs.

Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

Go Up