Text Array gesucht

Moin,

ich möchte gerne ein (ich nenne es mal) Text Array haben.
Das Textarray wird mit den Inhalten einer Datenbank gefüllt.
Nach dem Füllen zur Laufzeit soll es z.B. so aussehen:
type[0]="temperature"
type[1]="electric meter"
type[2]="water"
type[3]="frequency"
type[4]="humidity"
type[5]="pressure"

Wie muss das Array deklariert werden?

Lieben Gruß,
Chris

"text" ... ein char array
"textarray" ... ein array von char arrays ... also ein multidimensionales array

char typeText[6][20]

Hallo,

alternativ, wenn man es wegen höherem Ram-Verbrauch nicht übertreibt, auch mit der String-Klasse:

String type[6];

type[0] = “temperature”;
type[1] = “electric meter”;

usw.

Gruß aus Berlin
Michael

Nach dem Füllen zur Laufzeit

-->Heißt das, die Anzahl der Wörter ist Dir am Anfang nicht bekannt, bzw. variabel?

Moin,

Okay, das heisst ein Array von char Arrays belegt weniger RAM als eine String-Klasse. Richtig?

Ich habe das jetzt mal mit einem Array von char Arrays versucht, aber leider funktioniert das noch nicht.

Ich habe das so deklariert:

char ChannelType[8][20];

Und weise es so zu:

ChannelType[i] = entity["type"];

Die Fehlermeldung ist:
“incompatible types in assignment of ‘ArduinoJson::Internals::JsonObjectSubscript<const char*>’ to ‘char [20]’”

In einem anderen Beispiel ist dies so zugewiesen und funktioniert:

const char* entity_type = entity["type"];

Ich brauche es jedoch als Array.

Hat jemand eine Idee?

Heißt das, die Anzahl der Wörter ist Dir am Anfang nicht bekannt, bzw. variabel?

Doch, die Anzahl weiss ich, auch die maximale Länge, aber eben nicht welcher Eintrag auf welcher Position ist.

Lieben Gruß,
Chris

Ich brauche es jedoch als Array.

Dann lege ein Array aus Zeigern an. Wo ist da das Problem? Zeiger sind auch nur Datentypen

Das ist sowieso die bessere Wahl als ein multi-dimensionales Array. Bei dem belegen alle Elemente die maximale Anzahl an Bytes, auch wenn die Texte mal kürzer sind.

Moin,

Dann lege ein Array aus Zeigern an. Wo ist da das Problem?

Okay, denn nehm ich das.

Wie geht das?

Lieben Gruß,
Chris

themanfrommoon:
Wie geht das?

Genauso wie jedes andere Array auch

Sorry, ich raff es nicht.

Vielleicht hab ich mich auch nicht richtig ausgedrückt.

Ich fang nochmal von vorne an:
Ich frage mittels http request Daten über eine Middleware aus einer Datenbank ab. (Temperaturen, Stromzählerstände, Wasseruhr, Luftfeuchtigkeit, Luftdruck, und so weiter).
Diese speichere ich in verschiedenen Arrays.

Ich mach mal ein Beispiel mit 3 verschiedenen Datensätzen:
Der 1. Datensatz ist die Aussentemperatur.
Der 2. Datensatz ist der Stromzählerstand
Der 3. Datensatz ist der Luftdruck

Nun hab ich für verschiedene Informationen der Datensätze verschiedene Arrays. Der gemeinsame Schlüssel ist aber die Zahl 1., 2. und 3.

Da wäre also die UUIDs der Datensätze, hardcoded im Sketch:

char *UUID[3]= {             // Die UUID's der darzustellenden Kanäle werden in ein char array hinterlegt
"1083db27-5125-11e8-ba73-73ab1378038a",      // UUID des 1. Kanals "Temperatur Aussen"
"2027db74-5125-11e8-ba73-73ed1734758b",      // UUID des 2. Kanals "Stromzähler"
"3007db64-5125-11e8-ba73-73ce1736788c"};     // UUID des 3. Kanals "Luftdruck"

Die dazu passenden Anzeigetexte der Datensätze, hardcoded im Sketch:

char *Text[3]{             // Die Texte der darzustellenden Kanäle werden in ein char array hinterlegt
"C Temperatur Aussen",     // Anzeigetext auf Display für den 1. Kanal
"kWh Strom",               // Anzeigetext auf Display für den 2. Kanal
"hPa Luftdruck"};          // Anzeigetext auf Display für den 3. Kanal

Nun frage ich zur Laufzeit die Daten aus der Datenbank ab und speichere sie auch in Arrays:

uint16_t TextColor[3];          //Die Farbe des Kanals
float InitialConsumption[3];    //Den Anfangsstand des Kanals
float Cost[3];                  //Die Kosten des Kanals
float Messwert[3]={0};          //Den ausgelesenen Wert, muss am Anfang 0 sein
float OldMesswert[3]={99};      //Den vorigen ausgelesenen Wert, muss am Anfang was anderes als 0-98 sein
uint32_t LastTimestamp[3]={0};  //Den letzen Timestamp des ausgelesenen Werts, muss am Anfang 0 sein

Am Ende habe ich also verschiedene Arrays mit einem gemeinsamen Schlüssel (die Zahl 1,2 oder 3) die verschiedene Daten zu einem Messkanal haben.

Leider fehlt mir noch das Array mit dem Typ des Kanals.
Ich weiss nicht wie das richtig deklariert und zugewiesen wird.

Ich habe folgendes probiert:

char* ChannelType[3][20];                 //3 Char Arrays mit je 20 Chars
strcpy(ChannelType[i] ,entity["type"]);   //funktioniert nicht
oder
ChannelType[i] = entity["type"];          //funktioniert nicht

Wenn die Daten ausgelesen sind dann soll das Array so aussehen:
type[1]="temperature"
type[2]="electric meter"
type[3]="pressure"

Lieben Gruß,
Chris

char* ChannelType[3][20];                 //3 Char Arrays mit je 20 Chars

Nein. Das ist sind 3 * 20 Zeiger auf char. Der Stern ist nicht zum Spaß da

Hier sollte man sowieso ein Array aus structs verwenden. Alles was zusammengehört in ein struct packen, so dass deine Struktur einen Kanal darstellt. Und dann ein Array daraus. Das ist viel übersichtlicher als unzählige unabhängige Arrays.

char* ChannelType[3][20]; //3 Char Arrays mit je 20 Chars

Ist das nicht ein Array mit 60 Zeigen auf char ?
sizeof(ChannelType) sollte dann 120 liefern (bei einem AVR) …

Cool,

ich schreibe über 2200 Zeichen und dann liegt es an einem einzigen “*”

Sehr geil, nu läufts! Danke!

So geht’s:

char ChannelType[8][20];

so nicht:

char* ChannelType[8][20];

Es haperte an der Zuweisung.

Das funktionierte immer nicht: ChannelType[i] = entity["type"];
Damit läuft es nun aber: strcpy(ChannelType[i] ,entity["type"]);

Mit den Zeigern muss ich mich irgendwann nochmal beschäftigen. Da bin ich schon mehrfach drüber gestolpert, verstehe aber nicht was das ist.

Ihr habt mir wieder sehr geholfen, vielen Dank!
Lieben Gruß,
Chris

Also nur zufällig was eingetippt aber nicht verstanden was du eigentlich tust. Also nicht verstanden, dass so jeder String 20 Bytes belegt, auch wenn er kleiner ist. Das muss nicht falsch sein. Es gibt Fälle wo man die Kopie braucht weil der Quell-String nur temporär vorhanden ist, aber dir sollte der Untschied zwischen const char* und char[20] klar sein.

Das funktionierte immer nicht:

Natürlich funktioniert es nicht! Wie soll das auch gehen? Arrays kann man in C++ nicht mit = zuweisen weil Array Variablen nicht viel mehr als Zeiger auf das erste Element sind. Arrays sind keine richtigen Datentypen wie in anderen OOP Sprachen

Selbst einfache Array verwendest du nicht richtig:

float OldMesswert[3]={99};

Das setzt nur den ersten Index auf 99. Alle anderen sind 0

Korrekt wäre das:

struct Kanal
{
  uint16_t textColor;
  float initialConsumption;
  float cost;
  float messwert;
  float oldMesswert;
  uint32_t lastTimestamp;
  const char* type;

  Kanal() : oldMesswert(99.0)
  {
  }
};

Kanal Kanaele[3];

Oder ein Array für den String wenn man eine Kopie braucht. Alles andere ist in diesem Fall schlecht

Mehr dazu:
http://www.willemer.de/informatik/cpp/struct.htm