Forum: Mikrocontroller und Digitale Elektronik Wald vor lauter Bäumen / Arduino PrintString


von Sebastian W. (wangnick)


Lesenswert?

Liebe Leute,

ich sehe den Wald vor lauter Bäumen nicht. Es geht um C++, in diesem 
Fall in der Arduino-gcc-Umgebung.

Ich habe eine Klasse PrintString und versuche sie zu benutzen wie folgt:
1
class PrintString: public Print { 
2
  String s;
3
public:
4
  PrintString () {}
5
  virtual size_t write (uint8_t b) {s += (char)b; return 1;}
6
  operator String& () {return s;}
7
};
8
9
void setup() {
10
  Serial.begin(115200);
11
}
12
13
void loop() {
14
  const uint8_t txt[] = "Hello World";
15
  size_t tlen = sizeof(txt)-1;
16
  PrintString ps;
17
  ps.write(txt,tlen);
18
  ps.println();
19
  Serial.print(((String)ps).c_str());
20
  delay(10000);
21
}

Dieser code übersetzt nicht, und ich verstehe nicht warum:
1
"C:\\Users\\Hobbyraum\\AppData\\Local\\Arduino15\\packages\\arduino\\tools\\avr-gcc\\7.3.0-atmel3.6.1-arduino7/bin/avr-g++" -c -g -Os -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -MMD -flto -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10813 -DARDUINO_AVR_NANO -DARDUINO_ARCH_AVR "-IC:\\Users\\Hobbyraum\\AppData\\Local\\Arduino15\\packages\\arduino\\hardware\\avr\\1.8.3\\cores\\arduino" "-IC:\\Users\\Hobbyraum\\AppData\\Local\\Arduino15\\packages\\arduino\\hardware\\avr\\1.8.3\\variants\\eightanaloginputs" "C:\\Users\\HOBBYR~1\\AppData\\Local\\Temp\\arduino_build_162151\\sketch\\test18.ino.cpp" -o "C:\\Users\\HOBBYR~1\\AppData\\Local\\Temp\\arduino_build_162151\\sketch\\test18.ino.cpp.o"
2
C:\Users\Hobbyraum\Documents\Arduino\test18\test18.ino: In function 'void loop()':
3
test18:17:20: error: no matching function for call to 'PrintString::write(const uint8_t [12], size_t&)'
4
   ps.write(txt,tlen);
5
                    ^
6
C:\Users\Hobbyraum\Documents\Arduino\test18\test18.ino:5:18: note: candidate: virtual size_t PrintString::write(uint8_t)
7
   virtual size_t write (uint8_t b) {s += (char)b; return 1;}
8
                  ^~~~~
9
C:\Users\Hobbyraum\Documents\Arduino\test18\test18.ino:5:18: note:   candidate expects 1 argument, 2 provided
10
exit status 1
11
no matching function for call to 'PrintString::write(const uint8_t [12], size_t&)'

Print ist so definiert:
1
class Print {
2
...
3
  public:
4
...
5
    virtual size_t write(uint8_t) = 0;
6
    virtual size_t write(const uint8_t *buffer, size_t size);
7
...
8
    size_t println(void);
9
...
10
};

Wieso findet der Compiler println(void), jedoch nicht write(const 
uint8_t *buffer, size_t size) ???

LG, Sebastian

: Bearbeitet durch Moderator
von Programmierer (Gast)


Lesenswert?

Du brauchst "using Print::write" innerhalb der "class PrintString". 
Sonst verdeckt die "write" Funktion der abgeleiteten Klasse jene der 
Basisklasse.

von Εrnst B. (ernst)


Lesenswert?

Ansonsten schau dir das mal als Beispiel/Vorlage an:

https://github.com/esp8266/Arduino/blob/master/cores/esp8266/StreamString.h

Macht das ganze gleich Bi-Direktional, und statt dem Member-String mit 
dem impliziten Conversion-Operator macht der einfach ein
1
class StreamString: public String, public S2Stream

(S2Stream erbt von Stream erbt von Print, insofern ist's am Ende 
dieselbe Basisklasse wie bei dir)

: Bearbeitet durch User
von Einer K. (Gast)


Lesenswert?

Programmierer schrieb:
> Du brauchst "using Print::write" innerhalb der "class PrintString".
> Sonst verdeckt die "write" Funktion der abgeleiteten Klasse jene der
> Basisklasse.

So ist es!


Vermutlich möchtest du sowas erreichen:
1
class PrintString: public Print, public String
2
{
3
   // String s;
4
  public:
5
    using String::String;
6
    using Print::write;
7
8
    virtual size_t write (uint8_t b) override
9
    {
10
      *this += (char)b;
11
      return 1;
12
    }
13
};
14
15
void setup()
16
{
17
  Serial.begin(115200);
18
}
19
20
void loop()
21
{
22
  const uint8_t txt[] = "Hello World";
23
  size_t tlen = sizeof(txt) - 1;
24
  PrintString ps;
25
  ps.write(txt, tlen);
26
  ps.println();
27
  //Serial.print(ps.c_str());
28
  Serial.print(ps);
29
  delay(10000);
30
}

von Sebastian W. (wangnick)


Lesenswert?

Alles klar. Danke für die Hilfe!

LG, Sebastian

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.