Stringverknüpfung C/C++

Gast #5660625
Lesenswert?

In C/C++ kriege ich keine einfachen Stringverknüpfungen hin.

Bin Laie. Dachte aber, es geht so wie in anderen Sprachen:
1
void setup() {
2
  Serial.begin(9600);
3
  Serial.println("Boa" + "Constructor");
4
}
5

6
void loop() {
7
}

Auch mit "&" geht es nicht. Für einen Tipp danke ich.
#5660682
Lesenswert?

Boa Constructor schrieb:
> Sven B. schrieb:
>> Mikro 7. schrieb:
>>> (std::string("Boa") + "Constructor").c_str()
>>
>> Fraglicher Pattern, das funktioniert genau wenn es direkt als Argument
>> einer Funktion benutzt wird (die es sich zudem nicht merken darf) und
>> ansonsten nicht.
>
> was?

Das baut einen temporären std::string, und gibt dir dann einen Pointer 
auf dessen interne Daten. Sobald der temporäre std::string zerstört wird 
(was bei diesem Konstrukt quasi immer sofort passiert, außer es ist 
Argument einer Funktion -- dann bleibt es am Leben, bis die Funktion 
ausgeführt wurde) ist der Pointer ungültig.

Folgendes ist also ok:

func((std::string("Foo") + "Bar").c_str());

aber das nicht:

char* a = (std::string("Foo") + "Bar").c_str();
func(a);
Gast #5660690
Lesenswert?

1
Serial.println("Boa"  "Constructor");

-------------
1
Serial.println(String("Boa")+String("Constructor"));

-----------
1
Serial.println(String("Boa")+"Constructor");

---------
1
char a[] = "Boa";
2
char b[] = "Constructor";
3

4
void setup() 
5
{
6
  char temp[strlen(a)+strlen(b)+1] = "";
7
  strcpy(temp,a);
8
  strcat(temp,b);
9

10
  Serial.begin(9600);
11
  Serial.println(temp);
12
}
13

14
void loop() {
15
}
Gast #5660721
Lesenswert?

Dirk B. schrieb:
>
1
Serial.println("Boa");
2
> Serial.println("Constructor");


Dies habe ich bis jetzt getan. Nur mit mehr Strings. Gab irgendwann 
Performanceprobleme, daher will ich davon weg.

Das einzige, was bis jetzt geht, ist das hier.
1
Serial.println("Boa" "Constructor");

Bei der anderen Variante kriege ich leider immer
1
'string' is not a member of 'std'

Danke bisher
#5660722
Lesenswert?

Boa Constructor schrieb:
> g457 schrieb:
>> Serial.println("Boa" "Constructor");
>
> geht.

Das funktioniert, solange du Literals benutzt. Mit Variablen gehts es 
aber nicht.

>> #include <string>
>
> Ändert nichts. In allen Varianten nicht, auch nicht mit string.h
1
#include <string>
2
#include <stdio.h> // printf
3

4
int main()
5
{
6
  printf("%s\n",(std::string("Boa") + "Constructor").c_str()) ;
7
  return 0 ;
8
}
Gast #5660730
Lesenswert?

Mikro 7. schrieb:
> Boa Constructor schrieb:
>> g457 schrieb:
>>> Serial.println("Boa" "Constructor");
>>
>> geht.
>
> Das funktioniert, solange du Literals benutzt. Mit Variablen gehts es
> aber nicht.
>
>>> #include <string>
>>
>> Ändert nichts. In allen Varianten nicht, auch nicht mit string.h
>
>
1
> #include <string>
2
> #include <stdio.h> // printf
3
> 
4
> int main()
5
> {
6
>   printf("%s\n",(std::string("Boa") + "Constructor").c_str()) ;
7
>   return 0 ;
8
> }
9
>


Das funzt leider auch nicht. Oder bin ich zu blöd dazu, kann das sein?
1
#include <string>
2

3
                  ^
4

5
compilation terminated.
6

7
exit status 1
8
Fehler beim Kompilieren für das Board Arduino/Genuino Mega or Mega 2560.
Gast #5660738
Lesenswert?

Boa Constructor schrieb:
> Dies habe ich bis jetzt getan. Nur mit mehr Strings. Gab irgendwann
> Performanceprobleme, daher will ich davon weg.

Performanceprobleme?
Glaube ich nicht!

Hier noch eine Variante:
1
#include <Streaming.h> // suche nach "Arduino Streaming.h"
2

3
void setup() 
4
{
5
  Serial.begin(9600);
6
  Serial << "Boa" << "Constructor" << endl;
7
}
8

9
void loop() {}

Boa Constructor schrieb:
> Das funzt leider auch nicht. Oder bin ich zu blöd dazu, kann das sein?
> #include <string>
Bei der AVR ToolChain ist die STL nicht dabei.
Gast #5660747
Lesenswert?

Arduino hat eine eigene String Klasse, die ist hier dokumentiert: 
https://www.arduino.cc/reference/en/language/variables/data-types/string/

Die einzig sinnvolle Antwort hat hier jedoch Dirk gegeben: Man soll die 
Strings nicht zusammenfügen, wenn es vermeidbar ist.

Und zwar schlicht und ergreifend deswegen, weil man dann zumindest 
zeitweise doppelt so viel RAM belegt. Die beiden Quell-Strings belegen 
bereits Speicher und das Ergebnis der Zusammenfügung belegt nochmal 
Speicher.

Dazu kommt, dass man durch String-Manipulation Ratz-Fatz einen 
fragmentierten Heap produziert, der zu einem Heap/Stack Überlauf führt.

https://hackingmajenkoblog.wordpress.com/2016/02/04/the-evils-of-arduino-strings/
Gast #5660755
Lesenswert?

> wie ich Zahlenwerte in den Ausgabestring hinein bekomme.

Wenn keine besondere Formatierung notwendig ist, dann fülle einen Puffer 
(char[]) mit atoi() oder atol(). Siehe 
https://www.nongnu.org/avr-libc/user-manual/group__avr__stdlib.html

Wenn du Formatieroptionen brauchst, dann nimm printf(). Siehe 
https://www.nongnu.org/avr-libc/user-manual/group__avr__stdio.html

Die Serial Klasse von Arduino hat auch Funktionen für formatierte 
Ausgabe: 
https://www.arduino.cc/reference/en/language/functions/communication/serial/print/
Gast #5660757
Lesenswert?

Stefanus F. schrieb:
> Arduino hat eine eigene String Klasse, die ist hier dokumentiert:
> https://www.arduino.cc/reference/en/language/variables/data-types/string/
>
> Die einzig sinnvolle Antwort hat hier jedoch Dirk gegeben: Man soll die
> Strings nicht zusammenfügen, wenn es vermeidbar ist.
>
> Und zwar schlicht und ergreifend deswegen, weil man dann zumindest
> zeitweise doppelt so viel RAM belegt. Die beiden Quell-Strings belegen
> bereits Speicher und das Ergebnis der Zusammenfügung belegt nochmal
> Speicher.
>
> Dazu kommt, dass man durch String-Manipulation Ratz-Fatz einen
> fragmentierten Heap produziert, der zu einem Heap/Stack Überlauf führt.
>
> 
https://hackingmajenkoblog.wordpress.com/2016/02/04/the-evils-of-arduino-strings/

Ist schon klar. Ob der uC Garbage Collection kann (?) ist ja auch egal, 
lags will ich nicht provozieren. Momentan habe ich aber zuweilen eine 
Rekursion im ISR, wenn dort zu viele Serial.print ausgegeben werden. Was 
soll ich machen ohne Debugger. Es ist wie bei armen Leuten
Gast #5660762
Lesenswert?

Stefanus F. schrieb:
> Arduino hat eine eigene String Klasse, die ist hier dokumentiert:
> https://www.arduino.cc/reference/en/language/variables/data-types/string/

ja das geht, danke schonmal.

Kann ich auch Zahlen in den String integrieren?  Keine Literale, sondern 
Variablen. also wer VB kennt, ist beeindruckt von dem Aufwand in c. Soll 
aber keine Wertung sein, aber Stringverarbeitung ist (m.E.,) ein Kreuz
Gast #5660771
Lesenswert?

Boa Constructor schrieb:
> Kann ich auch Zahlen in den String integrieren?

Du hast die Seite nicht wirklich gelesen. Ich zitiere:

" For more details on the String object, which gives you more 
functionality at the cost of more memory, see the String object page."

Da hättest du nur drauf klicken brauchen.

https://www.arduino.cc/reference/en/language/variables/data-types/stringobject/
Gast #5660797
Lesenswert?

Die "Garbage Collection" von C++ nennt sich Smart Pointer. Natürlich ist 
das keine Garbage Collection im eigentlichen Sinne sondern nur die 
automatisierte Freigabe von Resourcen gebunden i.d.R. an die Destruktion 
des Smart Pointers (ein Objekt das eine Referenz auf die Resource 
besitzt).

Eine Garbage Collection im klassischen Sinn muss die Sprache selbst 
unterstützen. Das ist bei C und C++ nicht der Fall (und auch nicht 
wünschenswert). Eine Memory Management Unit + OS sind hilfreich aber 
eigentlich keine Voraussetzung. Die Garbage Collection ist bei 
(teil)interpretierten Sprachen eng mit der VM gekoppelt.
Gast #5660814
Lesenswert?

Boa Constructor schrieb:
> Momentan habe ich aber zuweilen eine
> Rekursion im ISR, wenn dort zu viele Serial.print ausgegeben werden.

Niemals in einer ISR Strings ausgeben. Das macht man nicht.
Eine ISR hat immer, bis auf ganz wenige Ausnahmen, so kurz wie möglich 
zu sein. Keine Ausgaben, keine (großen) Berechnungen, keine Delays.
Gast #5660824
Lesenswert?

Brummbär schrieb:
> Boa Constructor schrieb:
>> Momentan habe ich aber zuweilen eine
>> Rekursion im ISR, wenn dort zu viele Serial.print ausgegeben werden.
>
> Niemals in einer ISR Strings ausgeben. Das macht man nicht.
> Eine ISR hat immer, bis auf ganz wenige Ausnahmen, so kurz wie möglich
> zu sein. Keine Ausgaben, keine (großen) Berechnungen, keine Delays.

Ja Brummbär, entspann dich wieder :)

Boa Constructor schrieb:
> Was soll ich machen ohne Debugger. Es ist wie bei armen Leuten
#5660826
Lesenswert?

Boa Constructor schrieb:
> Dies habe ich bis jetzt getan. Nur mit mehr Strings. Gab irgendwann
> Performanceprobleme, daher will ich davon weg.

Bei Strings sollte man sich erstmal ein einheitliches Format überlegen, 
denn meistens sind Ausgaben recht ähnlich aufgebaut. Das erleichert es 
auch, die Ausgaben konsistent und ohne Schreibfehler zu halten. 
Obenrdrein spart es auch massig Speicher.
Ich hab da schon die dollsten Sache erlebt, wenn alle Ausgaben einzeln 
definiert werden, z.B.:
"Error xxx\n"
"error xxx\n"
"Eror xxx\n"
"Error: xxx\n"
"Error xxx!\n"
"Erorr: xxx !\n"

Beim AVR muß man etwas tricksen, damit Stringkonstanten nicht im RAM 
dupliziert werden.
1
#include <avr/pgmspace.h>
2
#include <stdint.h>
3

4
const char header_1[] PROGMEM = "header1";
5
const char footer_1[] PROGMEM = "footer1";
6

7
void display_item( char* buffer, char* header, uint16_t val, char* footer)
8
{
9
  sprintf_P(buffer, PSTR("%S %d %S\n"), header, val, footer);
10
}
11

12
void test(char* buffer)
13
{
14
  display_item(buffer, header_1, 1234, footer_1);
15
}

header, footer können auch als Array mit fester Stringlänge im PROGMEM 
definiert werden.
Gast #5660835
Lesenswert?

Konkretisiert schlägt der Wachhund an, wenn ich (testweise) 2 Meßreihen 
a' 5 Werte ausgebe. Das sind 2x 5 Werte mit 2x4 Tabs ("\t") dazwischen, 
also insg. 18 Serial.print. Das ist zuviel Last, weiß ich. Der ISR 
taktet mit 160 Hz.
Gast #5660843
Lesenswert?

Peter D. schrieb:
> Boa Constructor schrieb:
>> Dies habe ich bis jetzt getan. Nur mit mehr Strings. Gab irgendwann
>> Performanceprobleme, daher will ich davon weg.
>
> Bei Strings sollte man sich erstmal ein einheitliches Format überlegen,
> denn meistens sind Ausgaben recht ähnlich aufgebaut. Das erleichert es
> auch, die Ausgaben konsistent und ohne Schreibfehler zu halten.
> Obenrdrein spart es auch massig Speicher.
> Ich hab da schon die dollsten Sache erlebt, wenn alle Ausgaben einzeln
> definiert werden, z.B.:
> "Error xxx\n"
> "error xxx\n"
> "Eror xxx\n"
> "Error: xxx\n"
> "Error xxx!\n"
> "Erorr: xxx !\n"
>
> Beim AVR muß man etwas tricksen, damit Stringkonstanten nicht im RAM
> dupliziert werden.
>
>
1
> #include <avr/pgmspace.h>
2
> #include <stdint.h>
3
> 
4
> const char header_1[] PROGMEM = "header1";
5
> const char footer_1[] PROGMEM = "footer1";
6
> 
7
> void display_item( char* buffer, char* header, uint16_t val, char* 
8
> footer)
9
> {
10
>   sprintf_P(buffer, PSTR("%S %d %S\n"), header, val, footer);
11
> }
12
> 
13
> void test(char* buffer)
14
> {
15
>   display_item(buffer, header_1, 1234, footer_1);
16
> }
17
>
>
> header, footer können auch als Array mit fester Stringlänge im PROGMEM
> definiert werden.

ich mache das bis jetzt so:
1
#define SP(zahl)     Serial.print(zahl)       // Zahl seriell ausgeben
2
#define SPLN(zahl)   Serial.println(zahl)     // Zahl seriell ausgeben mit Zeilenumbruch
3
#define SPT(text)    Serial.print(F(text))    // Text seriell ausgeben
4
#define SPTLN(text)  Serial.println(F(text))  // Text seriell ausgeben mit Zeilenumbruch
5
#define SPTAB        Serial.print("\t")       // Tab ausgeben

aber das ist natürlich nicht performant, nur ein Workarround. Ich muss 
das jetzt verfeinern.

Ansonsten ist das auch nicht kritisch, wenn der Ticker den lfd. Prozess 
einholt, nur unschön.
Gast #5660847
Lesenswert?

Peter D. schrieb:
> Boa Constructor schrieb:
>> Konkretisiert schlägt der Wachhund an
>
> Der Watchdog hat in der Entwicklungsphase inaktiv zu sein. Man will ja
> alle Fehler sehen und sie nicht verstecken.

Ist doch kein Watchdog. Nur mein persönlicher "Wachhund" :-) Am 
ISR-Eingang wird, solange dort drin Code ausgeführt wird, abgefragt, ob 
der Event erneut aufgerufen wird. sei() ist natürlich immer aktiv, sonst 
geht das nicht. Ein rekursiver (oder wie sagt man hier..?) Aufruf wird 
mit "return" abgeblockt, so dass der Ticker nicht blockiert wird, 
solange im ISR code läuft.
Gast #5660876
Lesenswert?

Peter D. schrieb:
> Boa Constructor schrieb:
>> ich mache das bis jetzt so:
>
> Define ist kein Funktionsaufruf, d.h. der Code wird bei jeder Verwendung
> dupliziert. Mach ne Funktion draus, nur dann spart man auch.

Lohn nicht. Prints gibts nur i.d. entwicklung, als Debugger für arme.

So, habe ein wenig i.d. reference gestöbert u. 1 Lösung gefunden. Es 
scheint auch zu funktionieren, auch wenn es einfach aussieht

https://www.arduino.cc/reference/en/language/variables/data-types/stringobject/
1
void setup() 
2
{
3
byte i1 = 1;
4
byte i2 = 2;
5
byte i3 = 3;
6
byte i4 = 4;
7
byte i5 = 5;
8
  
9
  Serial.begin(9600);
10
  Serial.println(String(i1) 
11
             + String("\t")
12
             + String(i2) 
13
             + String("\t")
14
             + String(i3) 
15
             + String("\t")
16
             + String(i4) 
17
             + String("\t")
18
             + String(i5));
19
}
20

21
void loop() {}
Gast #5660884
Lesenswert?

Ob das jetzt performanter ist, weiß ich nicht. Heute werde ich das nicht 
mehr testen. Habs nur geschrieben, falls jemand dasselbe Problem hat, 
kann er/sie hier fündig werden.

Danke an alle.
Gast #5660902
Lesenswert?

Noch eine Info für die Nachwelt:

Habe mich noch mal eingelesen.  String (mit großem 'S') ist als 
Speicher-Fragmentierer verpönt. Das sollte man dann wissen. Mir macht's 
nichts, weil es nur zur Entwicklungszeit verwendet wird. Au jeden Fall 
will ich den tipp nicht gegeben haben, ohne darauf zu verweisen.
#5660940
Lesenswert?

Boa Constructor schrieb:
> Noch eine Info für die Nachwelt:
>
> Habe mich noch mal eingelesen.  String (mit großem 'S') ist als
> Speicher-Fragmentierer verpönt.

Das gilt ganz besonders, wenn man es so benutzt wie in deinem Beispiel

> Das sollte man dann wissen. Mir macht's nichts, weil es nur zur
> Entwicklungszeit verwendet wird.

Das hat nicht viel damit zu tun. Entweder der Speicher (und die 
Rechenzeit) reicht für dein Programm mit diesen ganzen Strings, dann 
stört es auch in der Release-Version nicht, oder es reicht nicht, dann 
funktioniert aber deine Entwickler-Version nicht.
Gast #5660954
Lesenswert?

Arduino Fanboy D. schrieb:
> Ist klar!

Ja du lässt die Leut' ins offene Messer laufen. Ein toller Ratgeber, 
muss ich schon sagen, Respekt.

Rolf M. schrieb:
> Boa Constructor schrieb:
>> Noch eine Info für die Nachwelt:
>>
>> Habe mich noch mal eingelesen.  String (mit großem 'S') ist als
>> Speicher-Fragmentierer verpönt.
>
> Das gilt ganz besonders, wenn man es so benutzt wie in deinem Beispiel

Was konkret ? Nur zum lernen, Speicher ist noch genug frei
#5660987
Lesenswert?

Boa Constructor schrieb:
> Rolf M. schrieb:
>> Boa Constructor schrieb:
>>> Noch eine Info für die Nachwelt:
>>>
>>> Habe mich noch mal eingelesen.  String (mit großem 'S') ist als
>>> Speicher-Fragmentierer verpönt.
>>
>> Das gilt ganz besonders, wenn man es so benutzt wie in deinem Beispiel
>
> Was konkret ? Nur zum lernen, Speicher ist noch genug frei

Jedesmal, wenn du den Operator + verwendest, wird für das Ergebnis ein 
neuer Speicherblock allokiert, der natürlich auch jedesmal etwas größer 
ist, als der davor. Da werden dann die beiden Strings reinkopiert. Erst 
ganz am Schluss wird alles wieder freigegeben.

Das da kostet also erstens jede Menge Rechenzeit, zweitens jede Menge 
Speicher:

Boa Constructor schrieb:
> Serial.println(String(i1)
>              + String("\t")
>              + String(i2)
>              + String("\t")
>              + String(i3)
>              + String("\t")
>              + String(i4)
>              + String("\t")
>              + String(i5));

Auf die Schnelle hab ich dazu auch die folgende ausführlichere Erklärung 
gefunden: 
https://hackingmajenkoblog.wordpress.com/2016/02/04/the-evils-of-arduino-strings/
Gast #5660990
Lesenswert?

Dirk B. schrieb:
> Boa Constructor schrieb:
>> 18 Serial.print. Das ist zuviel Last, weiß ich. Der ISR
>> taktet mit 160 Hz
>
> Das ist kein Problem der 18 Funktionsaufrufe (von Serial.print)
> Es sind zuviel Daten für deine 160 Hz.
>
> bei 9600 Baud / 10 (Bits pro Zeichen) / 160 Hz komme ich auf 6 Zeichen
> die vernünftig rüber kommen.
> Und da wird nichts anderes mehr ausgeführt.

Ja kann sein. Vermutlich hast du recht. Die Baudrate lässt sich 
vielleicht hochsetzen.
Gast #5660993
Lesenswert?

Rolf M. schrieb:
> Jedesmal, wenn du den Operator + verwendest, wird für das Ergebnis ein
> neuer Speicherblock allokiert, der natürlich auch jedesmal etwas größer
> ist, als der davor. Da werden dann die beiden Strings reinkopiert. Erst
> ganz am Schluss wird alles wieder freigegeben.

OK, danke. Ja das leuchtet mir ein,
Gast #5661011
Lesenswert?

Boa Constructor schrieb:
> .....
> also dann Strings via Array vor-verketten und den (char)Pointer an
> Serial.print übergeben? Nur mal so dahingedacht, bin kein c Profi

Wie gesagt ist der beste Weg, die Strings gar nicht zu verketten. Besser 
jeden Teilstring einzeln ausgeben. Durch die serielle Schnittstelle 
kommt das hinten als ein Datenstrom heraus, egal wie viele 
"Serial.print" Aufrufe dazu nötig waren.
Gast #5661030
Lesenswert?

OK. Also bleibt es so, wie gehabt

Boa Constructor schrieb:
> ich mache das bis jetzt so:
>
1
> #define SP(zahl)     Serial.print(zahl)       // Zahl seriell ausgeben
2
> #define SPLN(zahl)   Serial.println(zahl)     // Zahl seriell ausgeben 
3
> mit Zeilenumbruch
4
> #define SPT(text)    Serial.print(F(text))    // Text seriell ausgeben
5
> #define SPTLN(text)  Serial.println(F(text))  // Text seriell ausgeben 
6
> mit Zeilenumbruch
7
> #define SPTAB        Serial.print("\t")       // Tab ausgeben
8
>


Ich ging bisher davon aus, die vielen print wären das Problem. Aber wenn 
man nachrechnet, die Baudrate, dann ergibt sich der Rest.
Gast #5661444
Lesenswert?

Diese Funktion ermittelt (auf den ersten Blick) die Summer aller freier 
Speicherblöcke. Fragmentierung bemerkt man damit nicht.

Die folgende Funktion testet mit einer in 10er Schritten aus, wie viel 
Speicher man an einem Stück belegen kann.
1
unsigned short function_freememory(char* buffer) {
2
    //
3
    void *p = 0;
4
    size_t size;
5
    for (size = RAMEND; size > 1; size -= 10) {
6
        p = malloc(size);
7
        if (p != 0) {
8
            break;
9
        }
10
    }
11
    if (p != 0) {
12
        free(p);
13
    }
14
    else {
15
        size=0;
16
    }
17
    return sprintf_P(buffer,PSTR("%5u"),size);
18
}
#5661445
Lesenswert?

Man kann auch einfach plain C verwenden und mit strcat Strings 
aneinander kopieren. Dann wird kein unnützer Speicher alloziert. Man ist 
dann aber selber dafür verantwortlich, daß der Zielstring genügend groß 
ist. Malloc wird nicht benötigt.
Mit strncat kann man absichern, daß der Zielstring nicht überläuft. Was 
man zuviel reinschreiben will, wird abgeschnitten.
Gast #5661470
Lesenswert?

Stefanus F. schrieb:
> Die folgende Funktion testet mit einer in 10er Schritten aus, wie viel
> Speicher man an einem Stück belegen kann.
> unsigned short function_freememory(char* buffer) {

Die Funktion ist krank oder sehr unsauber.
Gibt offensichtlich einen Zeiger zurück, ist aber als unsigned short 
deklariert.
Das passt nicht.

Es wäre voll ausreichend, wenn sie nur ein size_t zurückgeben würde.
Die Stringgenerierung kann man doch anderen Zuständigkeiten überlassen.

Die korrekte Funktion der Funktion habe ich (noch) nicht getestet.
Gast #5661477
Lesenswert?

PeDa
>Man kann auch einfach plain C verwenden und mit strcat Strings
>aneinander kopieren. Dann wird kein unnützer Speicher alloziert.

Das ist schon wahr, aber die Arduino-String-Funktionen sind so 
unglaublich bequem:
https://www.arduino.cc/reference/en/language/variables/data-types/stringobject/

Wirklich, bis man das alles mit C zusammen hat, ist man eine Weile 
unterwegs.

Ich vermute, Arduino-String ist ein Versuch, sich der Java-API zu 
nähern:
https://www.dpunkt.de/java/Referenz/Das_Paket_java.lang/68.html
Gast #5661485
Lesenswert?

Arduino Fanboy D. schrieb:
> Die Funktion ist krank oder sehr unsauber.
> Gibt offensichtlich einen Zeiger zurück, ist aber als unsigned short
> deklariert.

Sie gibt die Anzahl der Zeichen zurück, die in den Buffer geschrieben 
wurden.

Ich bin ein bisschen erstaunt, dass du nicht mit der Funktion 
sprintf_P() vertraut bist.

> Es wäre voll ausreichend, wenn sie nur ein size_t zurückgeben würde.
> Die Stringgenerierung kann man doch anderen Zuständigkeiten überlassen.

Ja kann man. Ich habe das aus einem Programm heraus kopiert, wo es so 
gebraucht wurde. Ich erlaube Dir hiermit ausdrücklich, den kopierten 
Code nach deinen Bedürfnissen anzupassen. Zufrieden?
Gast #5661489
Lesenswert?

Cornelius schrieb:
> Ich vermute, Arduino-String ist ein Versuch, sich der Java-API zu
> nähern:
Das vermute ich auch.
Denn die ursprüngliche Basis/Vorbild soll wohl Processing sein.

Cornelius schrieb:
> Das ist schon wahr, aber die Arduino-String-Funktionen sind so
> unglaublich bequem:

Noch bequemer ist wohl das Streaming.
Zumindest bei den einfachen Ausgaben die in diesem Thread zu sehen sind.
Siehe: Beitrag "Re: Stringverknüpfung C/C++"
Gast #5661500
Lesenswert?

Stefanus F. schrieb:
> Sie gibt die Anzahl der Zeichen zurück, die in den Buffer geschrieben
> wurden.
>
> Ich bin ein bisschen erstaunt, dass du nicht mit der Funktion
> sprintf_P() vertraut bist.

Sorry.
Den Punkt nehme ich zurück....
Es ist kein Zeiger, sondern die Anzahl Zeichen.

Allerdings wäre  hier int der richtige Datentype.
> On failure, a negative number is returned.
Da ist unsigned sicherlich gänzlich falsch.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren