Char Arrays verbinden in Funktionsaufruf funktioniert nicht!

Moin,
ich hab folgenden Code geschrieben:

char eins={"WERT:"};
char zwei={"17,5"};
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
}
char zusammen(char a, char b){
char combi[sizeof(a)+sizeof(b)+1];
return sprintf(combi,"%s %s",a,b);

void loop() {
// put your main code here, to run repeatedly:
Serial.println(zusammen(eins, zwei));
delay(500);
}

Leider funktioniert der funktionsaufruf bzw. der Monitor gibt Müll aus.
Wenn ich folgendes in die loop direkt eingebe funktioniert es:
char combi[sizeof(a)+sizeof(b)+1];
Serial.println(sprintf(combi,"%s %s",a,b));

Wo liegt mein Fehler? kann sprintf das 'a' und 'b' nicht zuordnen?
Beste Grüße

Du hast eine Funktion die Zeichen als Parameter erwartet, diese aber als Zeichenketten behandelt.

Du hast eine Funktion die ein Zeichen als Rückgabewert hat, behandelst den aber als Zeichenkette.

Du glaubst dass sizeof() etwas anderes macht als es tut (auch nach Korrektur von Fehler 1).

Du willst die Adresse eines lokalen Buffers zurückgeben (der existiert nach dem Funktionaufruf nicht mehr).

pascas:
Wenn ich folgendes in die loop direkt eingebe funktioniert es:
char combi[sizeof(a)+sizeof(b)+1];
Serial.println(sprintf(combi,"%s %s",a,b));

Das stimmt sicher nicht, in loop ist a und b nicht definiert.

Du benutzt keine Kode-Tags für deinen Kode.

Wenn Du Zeiger übergibst, geht sowas:

char eins[] = {"WERT:"};
char zwei[] = {"17,5"};
char combi[sizeof(eins) + sizeof(zwei) + 1];

void setup() {
  Serial.begin(9600);
  Serial.println("Anfang");
  zusammen(eins, zwei);
  Serial.println(combi);
}

void zusammen(char * a, char * b) {
  sprintf(combi, "%s %s", a, b);
}

void loop() {}

Der Standard Weg ist den Puffer als Parameter zu übergeben und dann wieder zurückzugeben:

char* func(char* buffer)
{
   ...

   return buffer;
}

Dann existiert der Speicher außerhalb und man kann die Funktion direkt in andere Funktionen einsetzten.

Aber beachten:
sprintf() gibt NICHT den Puffer zurück! Sondern die Anzahl der geschriebenen Zeichen! "return sprintf()" ist also hier falsch

Der Standard Weg ist den Puffer als Parameter zu übergeben... , und seine Länge

char buffer[100];
void setup() { Serial.begin(9600); }
void loop() {
   Serial.println(func(buffer, sizeof buffer));
   delay(1000);
}


char* func(char* buffer, unsigned int len)
{
   // take care not to exceed len
   snprintf (buffer, len, "%s %s ! ;)         ", "Hello", "World");
   return buffer;
}

Warum sollte die Länge übergeben werden? Das sizeof kann die Funktion doch selbst machen. (Spart Stack)

Gruß Tommy

Tommy56:
Warum sollte die Länge übergeben werden? Das sizeof kann die Funktion doch selbst machen.

Nein, kann sie nicht. Ihr sizeof() liefert 2, die Länge des Pointers.

Stimmt. Mein Fehler.

Gruß Tommy