indexOf -> Array of Pointer - geht das?

Hallo,
ich versuche mich gerade an ein wenig umfangreicheren Arrays.
Jetzt habe ich was zusammen gebastelt und bin kläglich hängen geblieben.

Ich will eigentlich sowas wie ne Datenbankabfrage bauen.
Wo ich ein Schlüßelwort eingebe und das dann in den tausend-und-eins Arrays gefunden wird und mir damit was macht. z.B. Zeit runter zählen und was auf ein Display schreibt.

Was habe ich bis jetzt:

//Bauteilliste
char* bauen[] = {"Teil1", "Teil2", "Teil3"}; //array of char

//kürzel, Zeit
//Kürzel wird auf dem Display gezeigt
//Zeit wird an den internen Zeitzähler übergeben
char* data[3][4] = {
  {"PYLO", 18}, // Teil1
  {"GATE", 46}, // Teil2
  {"GAS ", 21}, // Teil3
};

Jetzt dachte ich, das ich in der Variable 'bauen' nach dem Schlüßelwort abfragen kann. Bzw die Position des Schlüßelwortes rausbekomme.

int schluessel = bauen.indexOf("Teil1");

Der index soll dann in ein int übergeben werden.
Und das wiederum ist der neue index für das 'data' - Array.

Hier will ich dann das Kürzel und die Zeit nochmal extra trennen und einzel verarbeiten.

indexOf ist aber scheinbar mit dem DatenTyp nicht einverstanden und ich hab, weils grad noch zu hoch für mich ist, erfolgreich die wand angeschlagen.

Ist das zu kompliziert?
Datenbank simulation über tausende Arrays?

Für nette Hinweise bin ich sehr Dankbar.

Vielen Dank
thilda

Hallo,

wenn ich mir das so überlege, möchtest du bestimmt ein struct erstellen und damit dein Array. Dann ist der selbst erstellte Datentyp vom struct der Datentyp vom Zeiger und du kannst auf struct Member zugreifen. Wobei du dafür aus meiner Sicht keinen Zeiger benötigst, denn auf das Array kannste Index basiert zugreifen. Mach dich mal mit struct vertraut …

auf welchem Arduino bist du?
Wie viel Daten wirst du speichern?
1001 mal n bytes im RAM eines UNO wird nicht mehr viel Platz für ein lauffähiges Programm lassen.

Auch für größere Kandidaten, google nach "Arduino PROGMEM"

Der schwierigste Teil ist die Beschreibung, was Du machen möchtest. Ich rate mal:

Du hast (irgendwie) ein Schlüsselwort empfangen, und möchtest es im string Array bauen suchen.
keyval = bauen.indexOf(keyword);
Ob es dafür in C++ ein passendes indexOf() gibt, kann nur ein C++ Experte beantworten, ich nicht.

Dann möchtest Du die zu diesem Schlüsselwort gehörenden Daten aus dem struct Array data holen und damit irgendwie weiterarbeiten.
... data[keyval].text ...

Richtig?

Für Dein Array data mußt Du eine struct definieren, das ist kein Array von nur Strings.

Dann kannst Du aber auch gleich alles in einer struct ablegen, also z.B.
{"Teil1", "PYLO", 18"}...

In einem Array von so einer struct kann man dann blitzschnell mit binärer Suche etwas finden, wenn man das Array nach den Schlüsselnamen sortiert.

thilda:

int schluessel = bauen.indexOf("Teil1");

Innerhalb eines String-Objekts kann man mit indexOf die Position einer Zeichenkette innerhalb einer Zeichenkette bestimmen. Das willst Du aber nicht. Möglicherweise hilft Dir strncmp:

//Bauteilliste
const char * bauen[] = {"Teil1", "Teil2", "Teil3"}; //array of char

int indexVon(const char * feld[], uint16_t elemente, const char * text) {
  uint16_t laenge = 0;

  for (int j = 0; j < elemente; j++) {
    laenge = strlen(feld[j]) > strlen(text) ? strlen(feld[j]) : strlen(text);
    if (!strncmp(feld[j], text, laenge)) {
      return j;
    }
  }
  return -1;
}

void setup() {
  Serial.begin(115200);
  while (!Serial);
  Serial.println("Anfang");
  char suchtext[] = {"Teil2"};
  int schluessel = indexVon(bauen, sizeof(bauen) / sizeof(bauen[0]), suchtext);
  Serial.println(schluessel);
}

void loop() {}

Die Sucheffektivität wäre dann ein weiteres Thema.

Zum Thema bzw. der Überschrift;
Array of Pointer - geht problemlos. Dein char* bauen[] ist eins.
IndexOf ist keine fertige und überall in C++ vorhandene Funktion.
Der Rest deiner Frage ist schwer zu verstehen.

Datenbank simulation über tausende Arrays?

... klingt sehr off-topic...

Da fällt mir gerade ein:

sizeOf und indexOf gibt/gab es ja mal als Makros. Bis mir gesagt wurde, daß sizeOf nicht zur Compilezeit verwendet werden kann - das war in den 70ern noch strittig. Einleuchtend war mir zumindest der polymorphe Parameter von sizeOf, als Variable oder Typ. Aber das muß doch eigentlich auch der Compiler entscheiden, um welches von beiden es sich handelt?

Wobei indexOf damals reine Adressrechnung war, basierend auf sizeOf, und sizeOf als Pointerarithmetik auf einem (virtuellen) Array.

Kann das mal jemand klären?

sizeof() ist ein Operator(!) der in den aller meisten Fällen zur Compile-Zeit ausgewertet wird. Das ist auch in C so

Ok, ich nehme mit:
ich schaue mir Struct an
werde versuchen mich nächste mal noch besser ausdrücken versuchen
und bin unglaublich dankbar für all die tollen Antworten.

Vielen Herzlichen Dank.

Als Info für noiasca und DrDiettrich:
ich nutze aktuell einen Arduino Mega und die Abarbeitung der befehle ist über eine, interne, eingestellte Liste.
Wird also keine externe Eingabe.
Das ganze ist als Hilfsprogramm gedacht um bauabfolgen auf Zeit, für ein Spiel, zu üben.

Die Liste der Daten ist also sehr überschaubar.

Ich werde mir jetzt jedenfalls erstmal Struct anschauen und dann mit den Vorschlägen hier weiter studieren.
Tausend Dank.
thilda

Die Liste der Daten ist also sehr überschaubar

Das klingt ja schonmal realistischer. Und du kannst die Daten selbst sinnvoll organisieren.
Dir also hoffentlich ersparen, einen Text zu suchen :slight_smile:

Habe heute diesen thread gefunden: https://forum.arduino.cc/index.php?topic=636783.0

Fand ihn sehr sehr hilfreich und werde jetzt mal schauen wie viel hängen geblieben ist : D