[erledigt] In welcher Bibliothek sind Strings definiert?

Hallo zusammen!

Bitte entschuldigt meine Frage. Wahrscheinlich stehe ich nur mal wieder auf dem Schlauch, aber ich bekomme seit Stunden die Fehlermeldung, dass std::string nicht definiert sei und ich komme nicht darauf, welche Bibliothek ich einbinden muss, damit das erledigt ist. Ich möchte endlich weiterprogrammieren ...

Gruß

Gregor

string
String

In der Arduino Software gibt es keine Standard Template Library. Was machst du also im std namespace? Es gibt eine STL Implementierung von Andy Brown, aber die ist nicht mehr zu neueren Versionen kompatibel.

Der Arduino inkludiert die Core Libraries wie String.h schon automatisch. Auch daran denken, dass das auf dem Arduino "String" heißt und nicht "string"

combie:
string
String

?

Der Fehler verursachende Code sieht so aus:

...
#include <inttypes.h>
...
void text(uint8_t, uint8_t, std::string, bool i=false);

Gruß

Gregor

std::string ist kein Arduino Code. Auf dem Arduino gibt keine C++ Standard (Template) Library

So oder so ist es übrigens keine gute Idee Objekte per value zu übergeben

Serenifly:
std::string ist kein Arduino Code. Auf dem Arduino gibt keine C++ Standard (Template) Library
So oder so ist es übrigens keine gute Idee Objekte per value zu übergeben

Anscheinend stehe ich tierisch auf dem Schlauch. Vielleicht stolpere ich auch nur über eine Arduino-Spezialität.

Ich schreibe gerade eine Bibliothek zu meinem neuen Spielzeug (ein OLED-Display, Foto hier). Im Header der Bibliothek möchte ich eine Funktion deklarieren, die einen String bekommen soll. Also schreibe ich dort

// bla.h
...
#include <inttypes.h>
...
void text(uint8_t, uint8_t, String, bool i=false);
...

Wenn ich diesen Header nun in meinem Arduino-Programm einbinde, bekomme ich die Meldung

In file included from test.ino:1:0:
/home/gszaktilla/sketchbook/libraries/bla/bla.h:102:31: error: 'String' has not been declared
   void text(uint8_t, uint8_t, String, bool i=false);
                               ^
Fehler beim Kompilieren.

Boah, das Leben stinkt manchmal dermaßen ...

Gruß

Gregor

#include <inttypes.h>

// bla.h
...
#include <Arduino.h>
...
void text(uint8_t, uint8_t, String, bool i=false);

Boah, das Leben stinkt manchmal dermaßen ...

Meist sind es nicht die Umstände, welche unser Leben bestimmen, sondern unsere Reaktion darauf.
(irgendwo geklaut)

combie:
#include <inttypes.h>

// bla.h

...
#include <Arduino.h>
...
void text(uint8_t, uint8_t, String, bool i=false);



**Meist sind es nicht die Umstände, welche unser Leben bestimmen, sondern unsere Reaktion darauf.**
(irgendwo geklaut)

Super! Danke!

Gregor

Weiterhin:
Es ist meist klüger eine Referenz/Pointer auf das Objekt zu übergeben.

Und meist noch viel klüger ist es, auf "String", ganz zu verzichten.

Ja, wenn das in einem Header steht, muss man immer erst mal Arduino.h inkludieren. Das bringt dann den Rest mit rein.

Besser allerdings:

void text(uint8_t, uint8_t, const String&, bool i=false);

Das const ist hier ganz wichtig, da man sonst keine String Literale übergeben kann

Oder besser einen const char* wenn es nicht unbedingt String Objekte sein müssen. Dann wird nur eine Adresse übergeben und kein Objekt erstellt.

Serenifly:
Ja, wenn das in einem Header steht, muss man immer erst mal Arduino.h inkludieren. Das bringt dann den Rest mit rein.

Immerhin war der Schlauch, auf dem ich stand, ein Arduino-spezifischer.

Serenifly:
Besser allerdings:

void text(uint8_t, uint8_t, const String&, bool i=false);

Das const ist hier ganz wichtig, da man sonst keine String Literale übergeben kann

Oder besser einen const char* wenn es nicht unbedingt String Objekte sein müssen. Dann wird nur eine Adresse übergeben und kein Objekt erstellt.

Danke!

Gregor