boucle for et struct ...

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

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");
}
T_obs chemin[32];
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.

for(int i=1;i<32;i++)

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

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

Et ceci ?

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

dbrion06:
Pour votre malheur, et contrairement à toute logique, les tableaux de c (++) ont un indice commençant à 0

Ca, c'est une opinion subjective :smiley:

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 (++)...

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.

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)

Comme on l'a dit c'est très subjectif. Et dire que Fortran et Pascal sont plus logique est faux aussi.

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 (How to navigate through a vector using iterators? (C++) - Stack Overflow à chaque fois... python est muni aussi de cette possibilité.

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.

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

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.

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.

simplicité, supériorité, indiçage contre intuitif, indexage naturel

Tout ceci n'engage que toi. Tous les mots que tu emploies sont subjectifs.

Bon, il est subjectif de
a) s'interroger sur la valeur intellectuelle du "cherry-picking" (copier coller des mots, les faire passer pour une citation, et écrire que c'est "subjectif"
b) trouver ironique le fait de trouver des gens qui prétendent, derrière une objectivité de masse, que l'adressage à partir de zero est utile,
ce
dans un post qui illustre admirablement les défauts de l'indexage à partir de zero (utilisé par les créateurs de C pour éviter les calculs sur les pointeurs, et donner un mode d'adressage plus facile: comme pas mal de bidouillis après coup, c'est d'autant plus désastreux que, faute d'imagination, ce rapiéçage a été repris par d'autres langages),
c) se questionner sur la valeur objective de choix de masse (plus personne n'utilise Fortran -ce qui et faux, soit dit en passant-, donc il est mauvais: le contre exemple de l'Anschluss, en 1938, retire toute valeur à ces choix de masse)

Pour moi qui développe en PYTHON, JavaScript, PHP, C et C++, tant mieux s'il y a des ressemblances.

Venant de quelqu'un qui critique la subjectivité, c'est savoureux (et ont peut se demander si ces eressemblances sont une bonne idée)
En passant, l'adressage à partir de zero a dû semer une telle confusion qu'a été obligé d'introduire récemment dans C++ des iterateurs sur les vecteurs (sous une forme lourde: bourne again shell a cette notion et l'implémente de façon agréable depuis le siècle dernier, que dis je, le millénaire)

dbrion06:
je suis obligé, à chaque fois que je lis du C, de me rememorer que le premier élément est à l'indice zero...

C'est un problème qui t'est propre. Il n'est pas universel.

Les entiers naturels commencent à 0. Il est tout beau tout propre ce 0, pourquoi faire du racisme anti-zéro ?
Donc on commence à numéroter avec 0.
Et ainsi, l'index d'un tableau de 256 valeurs tient sur 8 bits (et pas 9). Ca c'est logique.

Donc on commence à numéroter avec 0.
Commentr etrouver le second element d'un vecteur?
Allez voir dans wikipedia comment ils indicent les matrices Produit matriciel — Wikipédia
N'hésitez pas à signaler une faute de logique.

Ca, c'est logique...

En fait on s'en fout complètement.
Le C est comme ça, on va pas le changer maintenant, faut faire avec.
Je ne vois vraiment pas l'intérêt de relancer la polémique à chaque fois qu'un sujet aborde les tableaux. Ça fini par devenir lassant.

A chaque fois qu'un sujet aborde les tableaux,
(ou presque), il y a un problème parce que l'indiçage à partir de zero (les indices de tableaux étaient une surcouche, les gens ayant peur des pointeurs) est une source de confusion terrible. Le fait que ça existe (tout comme la peste, le cholera) n'ôte rien à sa nocivité (C++ a mis .... une vingtaine d'années à mettre des iterateurs, bien complexes, mais qui permettent de remédier partiellement, sur PC, à cette confusion).