Mit einer Variable eine Variable abfragen?

Ich finde hier leider nichts in der Arduino Reference zur struct

Hallo,
wenn Du zwei Arrays vom Typ String hast kannst Du auch zwei for schleifen ineinander verschachteln wenn Du wissen willst ob und welche gleich sind. Über den Index kannst Du dann herausbekommen welche das sind . zB der 20 aus der Gruppe A und der 15 aus der Gruppe B.
Allerdings wirst Du langfristig mit String Objekten ehe nicht viel Spass haben. Dann solltest Du auf C Zeichenketten wechseln. Und dann wird es sicher einfacher mit Strukturen zu arbeiten. Wurde ja bereits in #16 geschrieben

Heinz
Heinz

Die Arduino Referenz ist nicht alles was du an Sprachmitteln hast. Vorhin hast du doch auch Google verwendet

Ja habe ich. Allerding bin ich davon ausgegangen das Arduino da vollständig ist.

Die AVR vector Implementierungen sind durchaus statisch, im Speicherverbrauch. Also eine konstante Anzahl Elemente.
Zudem spricht m8trix von "Variablen", und die klassifiziere ich erstmal als variabel.

Hier ist dann der Punkt gekommen, wo ich gerne sage:
Arduino ist C++ und C++ ist eine Sprache welche man lernen sollte, um sie verwenden zu können.
z.B. struct

Ich versuche es mal hiermit:

struct gehört auch nicht zur Arduino Referenz. struct gehört zur Sprache C / C++. Arduino programmiert man in der Regel mit C++. Langfristig wird dir nur ein C++ Buch weiterhelfen.

1 Like

Da gebe ich dir recht allerdings ist es nicht ganz so leicht.

Schau Dir mal dieses Beispiel an:

struct renn_struct {
  uint8_t bed;             // Bedeutung des nachfolgenden Textes
  char txt[MAXZEICHEN];    // Text
} myData;

Eine Struktur ist eine Sammlung verschiedenartiger Objekte, hier eine Variable vom Typ uint_8 und ein Feld vom Typ char. myData ist eine Struktur vom Typ renn-Struct.

1 Like

Hallo,

anderes Bsp., nicht von Tiff, aber ähnlich

struct StoppUhr // alles was für einen Timer benötigt wird
{
  // Member
  byte taster;
  unsigned long start;
  unsigned long stop;
  bool status;
};

// Objekte mit dem selbst gebauten Datentyp 'StoppUhr' erstellen
StoppUhr timer1;
StoppUhr timer2;

// Der Zugriff erfolgt mit dem Punktoperator
timer1.taster;
...
timer2.start;
...
usw.

Das sind die Basics.
Der Link zu Tiff48317 ist genau richtig. Von Anfang bis Ende durcharbeiten.
Er hat zu Beginn für 3 Taster alles 3x angelegt. Diesen Variablenwust abzuhandeln ist mühselig und fehlerträchtig. Deswegen baut man sich Strukturen. Jetzt hat er alle Eigenschaften seiner Taster in ein struct zusammengefasst und damit ein Array erstellt. Denn jedes Objekt mit jedem Member anzusprechen wäre ja immer noch mühselig, wenn auch nicht mehr so fehlerträchtig. Das Array hat dann die Größe der Anzahl seiner Taster. Ab dann lässt man eine for Schleife darüber laufen die alle Taster behandelt.

Der große Rest ist ausprobieren und verstehen was wie zusammenhängt. Geht nicht von heute auf morgen, ist uns allen klar.

1 Like

Hallo,
mein einfaches Beispiel von oben auf struct umgebaut könnte so aussehen. Ist jetzt ohne Abfragen der Längen.. zum Lesen

// Ein Array vom Type String Objekt
struct daten {
  char text[10];// max länge einer Zeichenkette
};
struct daten NameA[5]; // Gruppe A 5 Elemente
struct daten NameB[1]; // Gruppe B 1 Element 


void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  strcpy(NameA[0].text, "aaaaa"); // etwas reinschreiben 
  strcpy(NameA[1].text, "bbbbb");
  strcpy(NameA[2].text, "ccccc");
  strcpy(NameA[3].text, "ddddd");
  strcpy(NameA[4].text, "eeeee");

  strcpy(NameB[0].text, "ccccc");


  for (byte i = 0; i <= 4; i++) { // Abfrage Schleife
    Serial.print(NameA[i].text); Serial.print("  ");
    Serial.print(NameB[0].text);
    if (strcmp(NameA[i].text,NameB[0].text)) { // gibt 1 zurück bei ungleich
      Serial.print ("  Element "); Serial.print(i);
      Serial.println(" ist ungleich");
    }
    else {
      Serial.print ("  Element "); Serial.print(i);
      Serial.println(" ist gleich");
    }
  }
}


void loop() {
  // put your main code here, to run repeatedly:

}
1 Like

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

Ihr seit spitze mir raucht erstmal der Kopf.
und ich mache gleich weiter.

Danke und bis gleich.

So ich danke euch mein Problem ist gelöst.

Hallo,
danke für die Rückmeldung
Heinz

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.