Forum: Mikrocontroller und Digitale Elektronik gcc warning: narrowing conversion


von Stefan F. (Gast)


Lesenswert?

Es geht um ein C++ Projekt für den ESP8266 mit Arduino Framework. Ich 
suche eine bessere Lösung, um die Warnung "narrowing conversion" 
loszuwerden.
1
class OLED 
2
{
3
public:
4
    void init();
5
    ...
6
private:
7
    uint8_t y_size;
8
    bool i2c_send(uint8_t byte);
9
    ...
10
}
11
12
bool OLED::i2c_send(uint8_t byte)
13
{  
14
    ...
15
}
16
17
void OLED::init()
18
{
19
    ...
20
    #pragma GCC diagnostic push
21
    #pragma GCC diagnostic ignored "-Wnarrowing"
22
    i2c_send(y_size-1);
23
    #pragma GCC diagnostic pop
24
    ...
25
}

Ich verstehe Fehlermeldung so, dass y_size-1 im Extremfall -1 ergeben 
kann, aber das passt nicht in einen uint8_t. In der Praxis wird das aber 
nie passieren, und selbst wenn doch, würde nichts schlimmes passieren.

Gibt es eine elegantere Methode, außer die obige und außer den Datentyp 
der Argumentes von i2c_send() zu ändern?

von Oliver S. (oliverso)


Lesenswert?

Stefan U. schrieb:
> Gibt es eine elegantere Methode, außer die obige und außer den Datentyp
> der Argumentes von i2c_send() zu ändern?

Die richtige Lösung ist ein static_cast in der Klammer, aber elegant ist 
halt anders.

Oliver

von Dr. Sommer (Gast)


Lesenswert?

Stefan U. schrieb:
> Gibt es eine elegantere Methode, außer die obige und außer den Datentyp
> der Argumentes von i2c_send() zu ändern?
Casten:
1
i2c_send(static_cast<uint8_t> (y_size-1));

Stefan U. schrieb:
> Ich verstehe Fehlermeldung so, dass y_size-1 im Extremfall -1 ergeben
> kann,
Nicht ganz - das ist ein Relikt aus C, wo aus jeder arithmetischen 
Operation (hier: Subtraktion) mindestens ein "int" oder größer 
rauskommt. i2c_send will aber einen uint8_t, und da passt der nicht 
rein. Daher kann man das mit dem cast erzwingen. Es ist natürlich 
sinnvoll, vorher zu prüfen, ob y_size größer 0 ist.

von Rolf M. (rmagnus)


Lesenswert?

Damit in einem solchen Fall eine Warnung kommt, muss man die aber vorher 
explizit eingeschaltet haben, oder? Bei mir kommt sie selbst mit -Wall 
-Wextra nicht. Ich halte sie auch für wenig sinnvoll.

von Marco H. (damarco)


Lesenswert?

passiert aber auch trotzdem nichts schlimmes, nur das ein falsches byte 
per I2c ausgeben wird. Dann sieht die Ausgabe nicht so wie gewollt aus.

Ein Cast wäre nicht elegant löst aber das Problem und zeigt das dies so 
gewollt war. Elegant wäre es den übergebenen Parameter gleich so zu 
gestalten das die Rechnerei nicht anfällt.

von Stefan F. (Gast)


Lesenswert?

"static cast" habe ich noch nie gesehen. Danke für das Stichwort, jetzt 
habe ich wieder was zum Lernen für's Wochenende.

> Es ist natürlich sinnvoll, vorher zu prüfen, ob y_size größer 0 ist.

Na klar. In diesem konkreten Fall habe ich allerdings kein Display, wo 
ich die Fehlermeldung anzeigen könnte, weil das ja gerade der Treiber 
für das Display ist.

> Damit in einem solchen Fall eine Warnung kommt, muss man die aber vorher
> explizit eingeschaltet haben, oder?

Ja, das scheint eine Eigenart der Arduino Umgebung zu sein.

> passiert aber auch trotzdem nichts schlimmes, nur das ein falsches byte
> per I2c ausgeben wird. Dann sieht die Ausgabe nicht so wie gewollt aus.

Eben. Aber was erwartet man anderes bei einem Display mit 0 Pixeln Höhe? 
Kann nicht sinvolleres sein.

von Wilhelm M. (wimalopaan)


Lesenswert?

Eine Warnung über "narrowing" sollte da (bei einem Funktionsaufruf) 
nicht kommen. "Nur" eine "conversion" Warnung ...

Eine "narrowing"-Warnung kommt eigentlich nur, wenn man z.B. einen Ctor 
mit der "unified initialization syntax" verwendet (also "braces" statt 
"parenthesis").

Kann es sein, dass die Warnung sich auf eine andere Stelle bezieht?

von Stefan F. (Gast)


Lesenswert?

> Kann es sein, dass die Warnung sich auf eine andere Stelle bezieht?

Ja, ich es gar nicht mehr reproduzieren. Weiß der Geier, was ich da 
angestellt habe.

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.