Mit einer Variable eine Variable abfragen?

Hallo Leute,
ich versuche mit einer String var einen Array abzufragen geht das?

String FxZ1[] = {"bRpeat","EQ","rGate","Redux","Filter",....};   
String bRpeat[] = {"None","1 Bar","1/2 Bar","1/3 Bar",....}; 
...
...

  String FxZ2 = FxZ1[mWert1];
...
      lcd.print(FxZ2[mWert2]);

bsp. mWert1 = 1 und mWert2 = 4 dann ist FxZ2 = 1/3 Bar

Also mein Wert1 fragt in einem Array den Namen der var ab.
Und jetzt soll die var kombiniert werden mit Wert 2 und an einen LCD ausgegeben werden.

Ich danke Euch.

Kannst du deine Frage noch etwas genauer beschreiben ?
Ich steige da aktuell nicht durch.

Auch ich steige nicht so ganz durch. Für mich klingt es aber so als ob Du das Ziel mit einem zweidimensionalen Array erreichen könntest.

Gruß

Gregor

Also ich habe zB einen string Frangen = {“Frage1”;“Frage2”;“Frage3”};

Und die strings Frage1, Frage2, etc. zB string Frage2 = {“Wert1”,“Wert2”,“Wert3”};

Nun möchte ich aus/mit Fragen[2] die abfrage gestalten zB Frage2[3] = Wert3.

#Mein erster Ansatz:

String FxZ1[] = {"bRpeat","EQ","rGate","Redux","Filter",....};   
String FxZ2 = FxZ1[mWert1];

Nehmen wir an, mWert1 wäre 3.

FxZ2 hat jetzt den Inhalt von FxZ1[3]
Damit hat FxZ2 den Inhalt: “Redux”

Das geht nicht:

lcd.print(FxZ2[mWert2]);

Möchtest Du ein Array in ein anderes kopieren, das zum Schluß FxZ1 == FxZ2?
#Ende Ansatz.

Nein, Deine Aufgabenstellung ist falsch, wenn man das Ergebnis nimmt.

1/3 bar ergibt sich aus:

Da ist mWert1 nicht involviert.

Ich hab Deine Aufgabenstellung und das Ergebnis :slight_smile:

int Frage[] = {1, 2, 3};
int Antwort1[] = {4, 5};
int Antwort2[] = {6, 7};
int Antwort3[] = {8, 9};

void setup()
{
  Serial.begin(115200);
  Serial.println(F("Start..."));
  for (int i = 0; i < sizeof(Frage); i++)
  {
    if (i == 0)
    {
      for (int j = 0; j < sizeof(Antwort1 - 1); j++)
      {
        Serial.print(F("Frage: "));
        Serial.print(i + 1);
        Serial.print("\t");
        Serial.print(F("Antwort1 / Nummer "));
        Serial.print(j + 1);
        Serial.print(": ");
        Serial.println(Antwort1[j]);
      }
    }
    if (i == 1)
    {
      for (int j = 0; j < sizeof(Antwort1 - 1); j++)
      {
        Serial.print(F("Frage: "));
        Serial.print(i + 1);
        Serial.print("\t");
        Serial.print(F("Antwort2 / Nummer "));
        Serial.print(j + 1);
        Serial.print(": ");
        Serial.println(Antwort2[j]);
      }
    }

    if (i == 2)
    {
      for (int j = 0; j < sizeof(Antwort1 - 1); j++)
      {
        Serial.print(F("Frage: "));
        Serial.print(i + 1);
        Serial.print("\t");
        Serial.print(F("Antwort3 / Nummer "));
        Serial.print(j + 1);
        Serial.print(": ");
        Serial.println(Antwort3[j]);
      }
    }
  }
}
void loop() {

}

Las es durchlaufen - sag mir, ob es das ist.

1 Like

Also ich habe einen Array

string Namen[] = {"Name1","Name2",.....};

Und eine var Speicher

speicher = Namen[2];

Nun will ich aus:

string Name1[] = {"Wert1","Wert2","Wert3".....};

den Wert3 abfragen mit meiner var Speicher

Serial.println(speicher[3]); // = Serial.println(Name1[3]);

Also mit einer var wert einen Array abfragen, der den Namen der var trägt.

Ich glaube, du suchst ein assoziatives Array.
" Associative arrays C++"

1 Like

Ich danke Euch.

Ich hab’s mal gegoogelt:

Was ist assoziatives Array in C ++?

In der Programmiersprache c ++ ist ein assoziatives Array ein spezieller Array- Typ, bei dem der Indexwert von einem beliebigen Datentyp sein kann, dh char, float, string usw. sein kann. Außerdem erhalten die Indizes einen anderen Namen ist Schlüssel und die Daten, die an der Position des Schlüssels gespeichert sind, sind Wert.

Ja genau das suche ich! Leider finde ich es nicht hier in der Language Reference.

Auf den 8-Bit Prozessoren gibt es keine STL (Standard Template Library). Deshalb gibt es auch normal keine fortgeschrittenen Datentypen wie das.

Sowas kann man sich aber als sehr einfache Version auch selbst programmieren. z.B. ein Array aus einer Struktur. Das hat zwar keine gute Performance, aber bei so kleinen Sets fällt das nicht auf.

1 Like

Hallo,
ich glaube du verwechselst string als char zeichenketten und String objekte.

Wenn Du letzteres meinst dann schau dir mal das Beispiel an.
Heinz

// Ein Array vom Type String Objekt
String Name[5] {"aaaaa", "bbbbb", "ccccc", "ddddd", "eeee"};

// eine variable vom Typ String objekt
String Speicher = Name[2];

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);

  for (byte i = 0; i <= 4; i++) { // Abfrage Schleife 
    Serial.print(Name[i]); Serial.print("  ");
    Serial.print(Speicher);
    if (Name[i] == Speicher) { // wenn beide gleich sind
      Serial.print ("  Element "); Serial.print(i);
      Serial.println(" ist gleich");
    }
    else {
      Serial.print ("  Element "); Serial.print(i);
      Serial.println(" ist ungleich");
    }
  }
}


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

}
1 Like

Mein Set ist leider nicht klein glaube ich zu mindestens es sind ca.80 Variablen in über 2000 Zeilen Code (9x switche…case). Und es muss schnell sein (das ist es jetzt).

Eigentlich habe ich sowas wie ein assoziatives Array gesucht.
somit hätte ich nur noch max 200 Zeichen Code statt über 2000.

Allerdings hast du mich da auf eine Idee gebracht mit deinem CODE-Beispiel.

Ob es klappt werde ich heute Abend mal testen, dann wäre der CODE auch weit unter 1000 Zeichen.

Gut!
Dann dreht es sich nur noch um den Weg, wie du das erreichen kannst.

  1. Angenommen dein Compiler könnte solche Container. Dann verwende sie.
  2. Verwende einen µC, dessen Compiler die Container mitbringt.
  3. Auch für AVR gibt es einige vector Implementierungen.
  4. Die letzte Möglichkeit: Selber bauen.

du hast eine Frage, du hast eine Antwort. Aus meiner Sicht ist das ein Struct.
Hast du mehrere, mach ein Array von einem Struct.

Und wenn du im einfachsten Fall mit einem einfachen strcmp in einem For durch deinen Fragen suchst, hast du zunächst den Index der gefundenen F&A und damit Zugriff auf die passende Antwort.

Ich bezweifle dass du das bei 80 Variablen oder bei 2000 Variablen von der Laufzeit her nachteilig ist. Wenn - dann müsstest du zunächst klarlegen, worum es dir geht.

Du bist ja gut.
Ich habe überhaupt keine Ahnung und davon leider sehr viel!!

Was ist ein Struct?

Vektoren sind aber nur interessant wenn man das zur Laufzeit verändern möchte. Wenn alle Daten zur Compile-Zeit da sind reicht auch ein Array


80 Schlüssel sind nicht allzu viele. Das sollte auch so gehen. Wir reden hier nicht über hunderte oder tausende von Einträgen.
Ansonsten ist auch mit einem Array sehr einfach eine Binärsuche möglich wenn man es vorher sortiert.

Hallo,

eine Struktur/struct ist zum Bsp. dein DatenEncoder

struct DatenEncoder
{
  RotaryEncoder *enc {nullptr};
  long oldPos {0};
  long newPos {0};
  int dir {0};
};

Das ist ein selbstgebauter Datentyp den Serenifly ansprach. Damit bauste dir wiederum ein Array. Im Grunde ähnlich wie beim Encoder Thema.