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
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.
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
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.
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

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.