Division par le résultat de l'opérateur ternaire ?: --> truc qui m'échappe

Bonjour à tous

Voilà, pour un projet de régulation de ventilation, j’utilise une moyenne glissante de 6 mesures (toutes les 10 min)

à chaque fois que je rajoute une nouvelle valeur dans le tableau (buffer circulaire), je recalcule la somme des éléments du tableau, que je divise par le nombre de cases (6) pour avoir la moyenne. Jusque là, c’est simple.

Mais pour avoir une valeur correcte même tant que le tableau n’est pas encore totalement rempli, j’ai aussi un bool qui me dit si justement j’ai déjà rempli le tableau ou non, de manière dans ce cas à diviser non plus par le nombre total de valeurs, mais seulement par l’index courant du tableau (donc le nombre de valeurs réellement entrées dans le tableau)

Du coup pour avoir la bonne valeur pour la division, j’ai ça :

Tmoy6ext=0;
for(uint8_t i=0;i<6;i++) Tmoy6ext+=tab6Text[i];
Tmoy6ext = Tmoy6ext/(float)info.init6?6:(info.index6+1);

où Tmoy6ext est un float, tab6Text un tableau de 6 int, info.init6 un bool qui dit si le buffer a déjà été rempli ou non, et info.index6 est un uint8_t qui donne l’index courant du buffer.

C’est fort bien, mais ça ne fonctionne pas, le résultat (la valeur de Tmoy6ext à la fin) est toujours égal à 6.00

En revanche si j’écris ma dernière ligne ainsi :

Tmoy6ext /= (float)info.init6?6:(info.index6+1);

Ça fonctionne parfaitement :o

Pourquoi cette différence ??

Plus loin dans le code j’utilise une autre moyenne de 24 éléments, que j’avais codé de la même manière, et comme il se doit avec la première méthode j’ai invariablement 24.00 comme valeur.

Insérons quelques espaces :

Tmoy6ext = Tmoy6ext / (float)info.init6          ?         6  :  (info.index6+1);

Le compilateur lit : si Tmoy6ext / (float)info.init6 est vrai, renvoyer 6, sinon renvoyer info.index6+1
C'est une question de priorité des opérateurs.

Intéressant : au début, init6 est faux, donc vaut 0, donc on divise par 0, et donc pour le C l'infini est ... vrai (puisque le truc te renvoie 6)
Enfin, comme dirait Perceval, c'est pas faux :slight_smile:

Bonjour,

C'est une question de priorité des opérateurs
/ est plus priotitaire que ?: -> donc le premier exemple ne fonctionne pas
/= et ?: ont la même priorité et sont évalués de droite à gauche -> ça fonctionne

Salut ,

c ' est un cas courant de source de probleme dans tous les langages , j ' ai pris pour habitude afin de ne plus perdre du temps la dessus de toujours encadrer entre parentheses pour determiner moi meme les priorites de calcul .

De plus ca ajoute un peu de clarte et avec un colorateur syntaxique , ca facilite la visibilite , la comprehension et la mise en place :slight_smile:

:grin:

j ' ai pris pour habitude afin de perdre du temps

Désolé mais je n'ai pu m’empêcher, c'était trop tentant.

68tjs:
:grin:
Désolé mais je n'ai pu m’empêcher, c'était trop tentant.

MDR , j ' ai ecrit trop vite :stuck_out_tongue:

c ' est corrigé merci !

... tout simplement.

Je me sens un peu c**, là.

Merci !

Allez vaï, ça arrive aux meilleurs :confused: