Verstehen was da gemacht wird musst du aber schon selbst tun:
struct Element
{
const char* const key;
const char* const value;
};
Element data[] = { { "ba", "Value 1"}, { "aa", "Value 2"}, { "za", "Value 3"}, { "pa", "Value 4"} };
void setup()
{
Serial.begin(115200);
print();
search("fa");
search("ba");
search("za");
search("aa");
Serial.println("-----");
}
void loop()
{
}
void print()
{
for (auto &e : data) //Stichwort: "range based for loop". In anderen Sprachen "for each"
{
Serial.print(e.key);
Serial.print(" - ");
Serial.println(e.value);
}
Serial.println("-----");
}
void search(const char* key)
{
for (auto &e : data)
{
if (strcmp(e.key, key) == 0)
{
Serial.print(e.key);
Serial.print(" - ");
Serial.println(e.value);
return;
}
}
Serial.print("Key \"");
Serial.print(key);
Serial.println("\" not found");
}
Oder wenn man es mit Sortieren und Binärsuche machen möchte:
struct Element
{
const char* const key;
const char* const value;
};
Element data[] = { { "ba", "Value 1"}, { "aa", "Value 2"}, { "za", "Value 3"}, { "pa", "Value 4"} };
const size_t NUM_OF_ELEMENTS = sizeof(data) / sizeof(data[0]);
void setup()
{
Serial.begin(115200);
print();
qsort(data, NUM_OF_ELEMENTS, sizeof(Element), compareSort);
print();
search("fa");
search("ba");
search("za");
search("aa");
Serial.println("-----");
}
void loop()
{
}
void print()
{
for (auto &e : data)
{
Serial.print(e.key);
Serial.print(" - ");
Serial.println(e.value);
}
Serial.println("-----");
}
int compareSort (const void* a, const void* b)
{
return strcmp((*(Element*)a).key, (*(Element*)b).key);
}
int compareSearch (const void* a, const void* b)
{
return strcmp((const char*)a, (*(Element*)b).key);
}
void search(const char* key)
{
Element* element = (Element*)bsearch(key, &data[0], NUM_OF_ELEMENTS, sizeof(Element), compareSearch);
if (element == NULL)
{
Serial.print("Key \"");
Serial.print(key);
Serial.println("\" not found");
}
else
{
Serial.print(element->key);
Serial.print(" - ");
Serial.println(element->value);
}
}
Ist das wirklich nötig? Wahrscheinlich nicht. Aber die AVR libc bietet für sowas auch klassische C Funktionen. Das Sortieren kostet natürlich einmal Zeit. Dafür ist die Suche danach schneller