Mit einer Variable eine Variable abfragen?

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

1 Like