Ou si vous voulez une recherche plus rapide au dépend de la place mémoire, organiser en arbre
--> C’est sortir l’artillerie lourde pour votre cas (les switch ou les tableaux de structure c'est suffisant), mais à titre de documentation:
Supposons que vous ayez 4 fichiers d'icônes
const char * icone0 = "icone0.jpg";
const char * icone1 = "icone1.jpg";
const char * icone2 = "icone2.jpg";
const char * icone3 = "icone3.jpg";
et en supposant que les codes que vous ayez soient 1 4 7 6 3 13 14 10 8
, auquels sont associés une des images, on pourrait avoir l'approche suivante en prenant la structure d'arbre binaire de recherche :
Dans le code on définit une structure d'arbre à 2 branches qui comporte un code Météo, le pointeur vers le nom de fichier image associé à ce code et deux pointeurs vers branches de l'arbre.
struct arbre_binaire_t {
const long codeMeteo;
const char * icone;
arbre_binaire_t * gauche;
arbre_binaire_t * droite;
};
Puisque les associations valeurs / nom de l'image sont connues, on fabrique l'arbre à la main:
arbre_binaire_t code01 = { 1, icone2, NULL, NULL};
arbre_binaire_t code03 = { 3, icone0, NULL, NULL};
arbre_binaire_t code04 = { 4, icone3, NULL, NULL};
arbre_binaire_t code06 = { 6, icone1, NULL, NULL};
arbre_binaire_t code07 = { 7, icone2, NULL, NULL};
arbre_binaire_t code08 = { 8, icone0, NULL, NULL};
arbre_binaire_t code10 = {10, icone3, NULL, NULL};
arbre_binaire_t code13 = {13, icone1, NULL, NULL};
arbre_binaire_t code14 = {14, icone3, NULL, NULL};
Et comme on connait les valeurs (j'ai choisi ces nombres car ce sont ceux de l'image wikipedia)
On peut bâtir l'arbre en suivant les flèches
racine = &code08;
code08.gauche = &code03;
code08.droite = &code10;
code03.gauche = &code01;
code03.droite = &code06;
code06.gauche = &code04;
code06.droite = &code07;
code10.droite = &code14;
code14.gauche = &code13;
En commençant la déclaration par les feuilles on peut tout bâtir à la compilation:
arbre_binaire_t code01 = { 1, icone2, NULL, NULL};
arbre_binaire_t code04 = { 4, icone3, NULL, NULL};
arbre_binaire_t code07 = { 7, icone2, NULL, NULL};
arbre_binaire_t code13 = {13, icone1, NULL, NULL};
arbre_binaire_t code06 = { 6, icone1, &code04, &code07};
arbre_binaire_t code03 = { 3, icone0, &code01, &code06};
arbre_binaire_t code14 = {14, icone3, &code13, NULL};
arbre_binaire_t code10 = {10, icone3, NULL, &code14};
arbre_binaire_t code08 = { 8, icone0, &code03, &code10};
arbre_binaire_t * racine = &code08;
Voilà ensuite il ne reste plus qu'à écrire une petite fonction récursive trouveCode()
de parcours d'arbre qui va trouver, pour un code météo donné, le nom du fichier image.
Je suis sur mon smartPhone et j'ai pas accès au compilateur, mais ça donnerait un truc comme cela - aux fautes de frappes potentielles près:
struct arbre_binaire_t {
const long codeMeteo;
const char * icone;
arbre_binaire_t * gauche;
arbre_binaire_t * droite;
};
const char * icone0 = "icone0.jpg";
const char * icone1 = "icone1.jpg";
const char * icone2 = "icone2.jpg";
const char * icone3 = "icone3.jpg";
// on construit l'arbre binaire à la main puisqu'on connait les valeurs
arbre_binaire_t code01 = { 1, icone2, NULL, NULL};
arbre_binaire_t code04 = { 4, icone3, NULL, NULL};
arbre_binaire_t code07 = { 7, icone2, NULL, NULL};
arbre_binaire_t code13 = {13, icone1, NULL, NULL};
arbre_binaire_t code06 = { 6, icone1, &code04, &code07};
arbre_binaire_t code03 = { 3, icone0, &code01, &code06};
arbre_binaire_t code14 = {14, icone3, &code13, NULL};
arbre_binaire_t code10 = {10, icone3, NULL, &code14};
arbre_binaire_t code08 = { 8, icone0, &code03, &code10};
arbre_binaire_t * racine = &code08;
const char * trouveCode(const byte code, arbre_binaire_t* arbre)
{
if (arbre == NULL) return NULL;
if (arbre->codeMeteo == code) return arbre->icone;
if (code > arbre->codeMeteo) return trouveCode(code, arbre->droite);
return trouveCode(code, arbre->gauche);
}
void printCodes(arbre_binaire_t* arbre)
{
if (arbre == NULL) return;
printCodes(arbre->gauche);
printCodes(arbre->droite);
Serial.print(arbre->codeMeteo); Serial.print(" ");
}
void setup()
{
Serial.begin(115200);
Serial.setTimeout(10);
}
void loop() {
Serial.println(F("-----------"));
Serial.print(F("Codes valides: "));
printCodes(racine);
Serial.print(F("\nEntrez un code:"));
while (Serial.available() == 0);
long code = Serial.parseInt();
Serial.println(code);
const char * nomDufichier = trouveCode(code, racine);
if (nomDufichier == NULL) {
Serial.println(F("ERREUR - CODE INCONNU"));
} else {
Serial.print(F("L'image pour le code "));
Serial.print(code);
Serial.print(F(" est "));
Serial.println(nomDufichier);
}
}
En mettant la console série à 115200 bauds et qui ne renvoie rien en fin de ligne vous devriez avoir moyen de saisir un code, suivi de "entrée", et voir le nom de fichier associé si je ne le suis pas trompé
Have fun!