Optimisation et conseils

Bonjour à toutes et tous

Je suis actuellement en train de construire une pendule d'échec.

J'ai, grâce à deux rotary encoder, la possibilité d'éditer les timers de chaque joueurs indépendants. Quand on fait un clic long, on entre en mode d'édition et on peut alors choisir le type de timer qu'on veut, le temps de jeu, le temps additionnel ou le nombre de temps additionnels possible (pour le mode byoyomi).

Actuellement, quasi tout est fonctionnel, sauf que lorsque je veux convertir les millisecondes en temps lisible les deux temps additionnels en mode édition. Le code est dispo ici timer - Wokwi ESP32, STM32, Arduino Simulator

Et donc, si dans mon timer_edit_mode.cpp, je convertis (en passant par la fonction display_as_timer) aux lignes 105 et 116 ça plante, alors que si je n'en converti qu'une sur les deux on est bon. (on voit que mes afficheurs sont paumés quand il y a une erreur)


Je me demande s'il n'y a pas un soucis de mémoire quelque part mais je vous avoue ne pas être un grand connaisseur de c++. Je me tourne donc vers vous pour savoir si vous voyez un moyen d'optimiser mon code et faire en sorte que l'afficheur ne soit pas paumé?

(Question subsidiaire, on ressent pas mal le balayage de mes segments dans mon display 7 segment [backpack adafruit led], vous savez comment je peux réduire ça?)

Merci beaucoup!

inline String display_as_timer(long value) {
  value /= 1000;
  int value_as_minutes = value/60;
  int value_as_seconds = int(value) % 60;
  
  char display_array[4];
  sprintf(display_array, "%02d%02d", value_as_minutes, value_as_seconds);
  return display_array;
}

Dans la déclaration de la fonction tu dis retourner une String
A la fin de la fonction tu retournes une c-string.

J'ai tenté un return String(display_array); à la fin mais ça ne semble pas résoudre mon soucis :cry:

  char display_array[4];
  sprintf(display_array, "%02d%02d", value_as_minutes, value_as_seconds);

Bonjour,

Tu réserves un buffer de 4 octets alors que le sprintf va écrire 5 octets (il faut compter le \0 final).

En effet, quand je passe à char display_array[5]; je n'ai plus aucun soucis! (merci beaucoup!)

Cependant, je ne comprends pas bien, %02d est censé me retourner 2 digits non? Donc %02d%02d devrait être 2 digits + 2 digits soit 4 digits. Qu'est-ce que tu entends par le \0 final? Ca correspond à quoi?

En C/C++ une cstring est terminée par un 0. C'est comme ça que le C/C++ gère les chaines et connait leur longueur.

Ca roule, merci beaucoup pour tout ça! :slight_smile:

Est-ce que vous avez une piste pour le balayage des segments de mon backpack?