gcc warning: narrowing conversion

Gast #5184945
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?
Gast #5184966
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.
#5184985
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.
Gast #5185004
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.
#5185032
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?

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