Wald vor lauter Bäumen / Arduino PrintString

OP #6750140
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
#6750188
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)
Gast #6750273
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
}

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