Dirk schrieb:> Der Compiler interpretiert bei dir die "1" als signed char, was zu> unsinnigen negativen Indizes (>127) führen kann.
auch negative Indizes sind gültig.
Nicht bei Arrays, nur bei Pointern, und das Überlaufverhalten von
vorzeichenbehafteten Datentypen ist nicht definiert, also nicht per se
als negativ zu sehen.
Diese in meinen Augen etwas fragwürdige Warning scheint tatsächlich Teil
von GCC zu sein. Weshalb sie hier auslösen sollte ist jedoch unklar.
Aber vielleicht ist der hier gezeigte Code ja nicht der eigentliche
Code, nur "so ähnlich". Oder der relevante Teil fehlt.
Peter II schrieb:> im Test tritt es aber nicht auf:
Kann ja auch nicht, weil weit und breit kein Index vom Typ char zu sehen
ist. So aber schon, und da kriegt man die Warnung dann auch (-Wall):
1
intmain()
2
{
3
charc=1;
4
5
printf("Heute ist ");
6
printf(weekDay[c]);
7
8
return0;
9
}
Ich schrieb ja schon, dann brechbunkt hier möglicherweise den
eigentlichen Code zwecks Demonstration stark vereinfacht und damit die
Ursache gleich mit beseitigt hatte.
brechbunkt schrieb:> Wenn ich die Zeile allerdings (dank eurer Hilfe) so abändere, ist alles> gut:
Besser wäre es allerdings, tm_wday von vornherein einen sinnvollen
8-Bit-Typ zu geben, nämlich "unsigned char" oder "uint8_t".
Stefan Ernst schrieb:> Besser wäre es allerdings, tm_wday von vornherein einen sinnvollen> 8-Bit-Typ zu geben, nämlich "unsigned char" oder "uint8_t".
Mit dieser Idee kommst du rund 40 Jahre zu spät. Allerdings ist der
Unterschied bei Werten zwischen 0 und 6 nicht wirklich relevant.
Zumal für mich nicht nachvollziehbar ist, wieso negative ints gut sind
und negative chars schlecht.
Stefan Ernst schrieb:> Besser wäre es allerdings, tm_wday von vornherein einen sinnvollen> 8-Bit-Typ zu geben, nämlich "unsigned char" oder "uint8_t".
Ganz und gar nicht. Der Index muss int sein, kein char - dann
klappts auch ohne Warnung bzw. Laufzeit-Fehler.
A. K. schrieb:> Stefan Ernst schrieb:>> Besser wäre es allerdings, tm_wday von vornherein einen sinnvollen>> 8-Bit-Typ zu geben, nämlich "unsigned char" oder "uint8_t".>> Mit dieser Idee kommst du rund 40 Jahre zu spät.
Das Feld tm_wday der struct tm gemäß C-Standard ist vom Typ
"int".
Unser TE wird also wohl irgendwie sein eigenes Süppchen kochen.
> Zumal für mich nicht nachvollziehbar ist, wieso negative ints gut sind> und negative chars schlecht.
Ich denke nicht, dass es um negative chars schlechthin geht, aber
um mögliche Probleme bei der sign extension zu `int'. Bei
1
charc=240;
2
3
...
4
returnarray[c];
könnte das nämlich zu unliebsamen Überraschungen führen, wenn das
default `char' vorzeichenbehaftet ist, und davor zu warnen ist
die Sache m. E. Wert.
A. K. schrieb:> Stefan Ernst schrieb:>> Besser wäre es allerdings, tm_wday von vornherein einen sinnvollen>> 8-Bit-Typ zu geben, nämlich "unsigned char" oder "uint8_t".>> Für diese Idee kommst du rund 40 Jahre zu spät.
Falls du auf die struct tm der time.h hinaus willst, dort ist tm_wday
ein int, kein char. Er verwendet also irgendwas eigenes oder
modifiziertes, und es spricht nichts dagegen, es zu ändern.
Jörg Wunsch schrieb:> signed char c = 240;
Da liegt das Hase im Pfeffer. Denn eigentlich müsste er an dieser
Stelle warnen. Das aber traut sich ohne -pedantic nicht einmal GCC,
weils sonst an Warnungen nur so hagelt.
tumb schrieb:> Stefan Ernst schrieb:>> Besser wäre es allerdings, tm_wday von vornherein einen sinnvollen>> 8-Bit-Typ zu geben, nämlich "unsigned char" oder "uint8_t".>> Ganz und gar nicht. Der Index muss int sein, kein char - dann> klappts auch ohne Warnung bzw. Laufzeit-Fehler.
Unsinn. Ein "unsigned char", "signed char", "int8_t" oder "uint8_t"
würde auch keine Warnung bringen.
A. K. schrieb:> Stefan Ernst schrieb:>> Falls du auf die struct tm der time.h hinaus willst, dort ist tm_wday>> ein int, kein char.>> Und int kann nicht negativ werden?
Es geht bei dieser Warnung nicht darum, dass der Index negativ sein
kann. Es geht darum, dass bei char die Signedness nicht spezifiziert
ist.
A. K. schrieb:> Jörg Wunsch schrieb:>> signed char c = 240;>> Da liegt das Hase im Pfeffer. Denn eigentlich müsste er an *dieser*> Stelle warnen.
Das "signed" hatte ich dann noch rausgeworfen. Wenn man das
hinschreibt, nimmt der GCC es als Hinweis, dass man sich was dabei
gedacht hat ;), und warnt nicht. Die Warnung kommt wirklich nur für
ein "unqualifiziertes" `char', und sie soll offenbar ausschließlich
darauf hinweisen, dass bei der Benutzung eines solchen als Array-Index
eine implizite Konvertierung nach `int' erfolgt mit all ihren
potenziellen Tücken.
A. K. schrieb:> Warum muss er int sein? Damit GCC die Schnauze hält?
Es ist nie gut, irgendwelche Warnungen im Code zu haben. Ein Programm
sollte immer ohne jegliche Warnungen compilieren. Alles andere ist
schlechter Stil.