Text mit Variablen kombinieren.

Hallo
Ich möchte gerne das "esp01" mit einer Variable ersetzten so dass ich das dann einmal in einer Variable definieren kann und nicht überall erneut esp01 hineinschreiben muss.

#define relay_topic "esp01/relay"
#define status_topic "esp01/status" 
#define inTopic "esp01/output"

Hallo,

den define Kram lässte mal bitte weg. Nur für Dinge die wirklich nicht anders möglich sind.
Wenn das nur für eine reine Textausgabe sein sollte, dann kannste dir ein struct bauen und gibts alles benötigte hintereinander aus. Dann das sieht zusammenhängend aus. Im struct legste dir alle Teiltexte an die du kombinieren möchtest.

Bsp.

struct Texte
{
  const char t1[4] = "Doc";
  const char t2[2] = "_";
  const char t3[8] = "Arduino";
  const char t4[5] = " :-)";
} text;

void setup(void)
{
  Serial.begin(9600);
  Serial.println();

  Serial.print(text.t1);
  Serial.print(text.t2);
  Serial.print(text.t3);
  Serial.print(text.t4);
  Serial.println();
}

void loop(void)
{
}

warum überhaupt #defines und nicht ALLES in const variablen?

edit: Quick:

/*
  #define relay_topic "esp01/relay"
  #define status_topic "esp01/status"
  #define inTopic "esp01/output"           // super konsistente Bezeichnung ...
*/

const char esp_id[] {"esp01"};
const char relay_topic[] {"relay"};
const char status_topic[] {"status"};
const char in_topic[] {"output"};
const char delimiter[] {"/"};


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

  //zu Fuß:
  Serial.print(esp_id);
  Serial.print(delimiter);
  Serial.print(relay_topic);
  Serial.println();

  // Umweg über buffer
  char buffer[42];
  strcpy(buffer, esp_id);
  strcat(buffer, delimiter);
  strcat(buffer, status_topic);
  Serial.println(buffer);

  // über eine Funktion --> Hausübung ;-)
}

void loop() {
}

//const char* relay_topic "esp01/relay"
const char* status_topic "esp01/status"
const char* inTopic "esp01/output"

Hab es jetzt mit char gemacht
Ich will ne Variable festlegen wo ich den Namen hineinschreibe und der wird dann statt "esp01" eingesetzt

christian181005:
Ich möchte gerne das "esp01" mit einer Variable ersetzten so dass ich das dann einmal in einer Variable definieren kann und nicht überall erneut esp01 hineinschreiben muss.

rudimentär

const char relay_topic[] = "relay";
const char status_topic[] = "status";
const char in_topic[] = "input";
const char esp_topic[] = "esp01/";

void setup()
{
  Serial.begin(115200);
  Serial.println(F("Start..."));
  char ausgabe[100] = {"\0"};
  strcpy(ausgabe, esp_topic);
  strcat(ausgabe, relay_topic);
  Serial.println(ausgabe);
  strcat(ausgabe, " Zusatztext");
  Serial.println(ausgabe);
}
void loop()
{}

christian181005:
//const char* relay_topic "esp01/relay"
const char* status_topic "esp01/status"
const char* inTopic "esp01/output"

Hab es jetzt mit char gemacht
Ich will ne Variable festlegen wo ich den Namen hineinschreibe und der wird dann statt "esp01" eingesetzt

Dann geht es mit "const" nicht.
Const ist Konstant, also nicht änderbar.

Dann geht es mit "const" nicht.
Const ist Konstant, also nicht änderbar.

Nein es soll direkt in der const variable eingesetzt werden

christian181005:
Nein es soll direkt in der const variable eingesetzt werden

Ok, dann steht es in der Variable und dann ?
Dann kannst du die Variable für deinen Sketch nutzen.

christian181005:
Nein es soll direkt in der const variable eingesetzt werden

Nein, das geht nicht!
Wenn Du meinen Ansatz nicht willst, kannst Dir eine Funktion schreiben, die Dir als Rückgabewert das zusammengebastelte liefert.
Beides in Einem ist ausgeschlossen.

Ich habe hier einen kranken Ansatz mit einem #define und ein paar const char*

#define NAME "esp01/"
const char* relayTopic = NAME"relay";
const char* statusTopic = NAME"status";
const char* inTopic = NAME"output";

void setup()
{
  Serial.begin(115200);
  Serial.println(relayTopic);
  Serial.println(statusTopic);
  Serial.println(inTopic);
}

void loop()
{
}

Liefert diese Ausgabe:

19:07:57.269 -> esp01/relay
19:07:57.269 -> esp01/status
19:07:57.269 -> esp01/output

wno158:
Ich habe hier einen kranken Ansatz mit einem #define und ein paar const char*

#define NAME "esp01/"

const char* relayTopic = NAME"relay";



Liefert diese Ausgabe:


19:07:57.269 -> esp01/relay

Der ist gut :wink:
Da macht der Preprozessor den Ersatz.
NAME muss ja doch noch jedesmal geschrieben werden.
Ok. Punkt wäre, wenn Name nur N wird.
Aber - und jetzt kommt mein Einwand:
Der Ersatz geht eben nicht zur Laufzeit...

Yep, alles richtig.

Die Anforderung ist allerdings auch etwas unscharf. Wenn es nur darum ginge, an nur einer Stelle diesen "prefix" esp01 ändern zu müssen wenn es ein raspi137 werden soll, könnte es reichen.

Und nein, produktiv würde ich sowas nicht einsetzen, sondern die Teile Ebene für Ebene zusammenbauen.

#define stellvertreter  "esp01/"
#define relay_topic     stellvertreter "relay"
#define status_topic    stellvertreter "status"
#define inTopic         stellvertreter "output"

void setup() 
{
  Serial.begin(9600);
  Serial.println(relay_topic);
  Serial.println(status_topic);
  Serial.println(inTopic);
}

void loop()  
{

}

combie:

#define stellvertreter  "esp01/"

#define relay_topic    stellvertreter "relay"
}

Ich bin ja immer davon ausgegangen, das #define irgendwie vermieden werden soll.
Jetzt machst Du das aber sogar doppelt gemoppelt.

Ich seh den Unterschied zu wno158 seinem Code nicht.
Vielleicht bin ich ja auch nur betriebsblind, aber ich würde das ganze irgendwie mit einer Funktion lösen, wenn mein Code von oben nicht reicht um das zur Laufzeit zu bewerkstelligen.

Andere Ideen?

Frage an den TO: Muss das zur Laufzeit zusammengestellt werden oder suchst Du nur einen Ersatz für eine "Autovervollständigenfunktion" im Editor.

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