Was tun mit Visual Studio Compiler Warnungen?
-
Hallo allerseits!
Geht es nur mir so?
Nach einigem Programmieren hat man beim Compilieren (insbesondere des gesamten Projektes) einen ganzen Haufen Warnungen, bei mir meistens sowas wie:warning C4244: '=' : conversion from 'double' to 'float', possible loss of data
was ja z.B. schon bei Zuordnungen wie
floatwert1 = 0.5 * floatwert2;passiert.
Ich finde diese ganzen Warnings jedenfalls ziemlich nervig, weil darin ggf. die Errors schwerer zu finden sind.Was meint Ihr, was ist dann das adäquate Vorgehen?
- Die Warnungen irgendwie ausschalten. (Bloß wie?)
- static_casts verwenden, z.B.
floatwert1 = static_cast<float>(0.5 * floatwert2);- Sowas wie:
floatwert1 = 0.5f * floatwert2;(Bloß wie geht das bei anderen Typen und gar Variablen?)
Sorry, ich fand nichts passendes in den FAQ....
Danke und Gruß,
Dong
-
Hallo,
naja ganz ausschalten / ignorieren wuerde ich diese Warnungen nicht. Evtl. entsteht dadurch halt mal ein Laufzeitfehler und dann sucht man sicht tot.
Vielleicht wirklich einfach alles casten, sind bei mir wohl auch immer die meisten Warnungen die auftreten.Wuesste jetzt spontan leider net, wo man sie in der IDE ausmachen kann.
MfG, Heimdall83
-
Das Ausscahlten von solchen Warnung per pragma wäre in meinen Augen sehr unvorsichtig und gefährlich. Korrekt ist es einen entsprechenden static_cast zu verwenden.
Bei Deinem Beispiel
floatwert1 = 0.5 * floatwert2;
muss Dir klar sein, das 0.5 ein double ist. Damit erfolgt auch die gesamte Arithmetik auf double und damit geht bei der Zuweisung entsprechend natürlich genaugkeit verloren.Du hast auch die Möglichkeit folgendes zu schreiben:
floatwert1 = floatwert2 / 2;
das löst such keinen Fehler aus.Ich weiß nicht genau was Du meinst woie man die Meldung bei Variablen ausschaltet.
Das Problem ist das der C/C++ Compiler automatisch den höchst wertigsten Datentyp verwendet für die Kalkulation, den Du in der Berechnung angegeben hast. Und bei dir ist eben 0.5 ein double!
-
schreib doch hinter die 0.5 einfach ein f.
floatwert1 = 0.5f * floatwert2;Im übrigen, der Compiler nervt nicht, sondern will dir mit den Warnungen nur helfen. Hier gilt mal wieder der Spruch "Egal wie man es macht, es ist falsch." Also, sehe das als Hilfe an, um deine Programme besser zu machen. Die meisten Warnings sind Hinweise, auf späteres _mögliches_ Fehlverhalten.
-
Martin Richter schrieb:
Bei Deinem Beispiel
floatwert1 = 0.5 * floatwert2;
muss Dir klar sein, das 0.5 ein double ist.Ist mir auch klar :)... (...aufgrund der Warnungen
)Martin Richter schrieb:
Du hast auch die Möglichkeit folgendes zu schreiben:
floatwert1 = floatwert2 / 2;
das löst such keinen Fehler aus.Danke, das mit 0.5 war allerdings nur ein Beispiel.

[Wobei intern *0.5 und /2 anders berechnet werden, was da wohl effizienter ist...?]Martin Richter schrieb:
Ich weiß nicht genau was Du meinst wie man die Meldung bei Variablen ausschaltet.
Ich wollte eigentlich nur sagen: Wenn es beim compilen/builden einen Error gab wäre es praktisch, wenn nur diese(r) angezeigt würde und nicht die Warnungen, in einem Wust von Warnungen ist so ein Error nämlich manchmal nicht leicht zu finden.
Derweil habe ich übrigens mal alle "conversion from 'double' to 'float', possible loss of data" Warnungen beseitigt (bei mir: 51), indem ich (z.B. ;)) statt 0.5 0.5f schrieb, was wohl bedeuten soll, dass diese Konstante als float interpretiert werden soll. Das war weniger Schreibarbeit als die casts.

Diesen 0.5f statt 0.5 Trick habe ich mal nebenbei in einem Beispiel gesehen, weiß jemand, wie diese Technik heißt und ob es da noch mehrere Möglichkeiten außer dem Anhängen von 'f' gibt?Und noch eine andere Frage, um die Warnungen "Conversation from float to short" und ähnliches loszuwerden:
Gibt es dazu eine schöne Rundungsfunktion?
(Eine Rundungsfunktion gefiele mir besser als ein cast, da der ja aus 0.9 0 macht, oder etwa nicht?)Danke und Gruß,
Dong
-
Artchi schrieb:
Im übrigen, der Compiler nervt nicht, sondern will dir mit den Warnungen nur helfen.
Gut, ich schränke diese Aussage auf den Fall ein, dass man in >100 Warnungen einen Error suchen muss.

Allerdings gibt es schon nervige Stellen, wie z.B. dass Checkboxes (auch, wenn sie nur wie üblich zwei Zustände haben) mit einer BOOL Variablen verbunden werden statt mit bool. Dann hagelt es nämlich "warning C4800: 'BOOL' : forcing value to bool 'true' or 'false' (performance warning)" Warnungen.
(Schon klar warum: BOOL hat mehr als 2 Zustände und ist im Grunde nicht anderes als kleine ganze Zahlen, z.B. für Checkboxes mit dem Zustand disabled oder so...)Nur, wie wird man diese Warnungen am besten los?
Immer eine if Unterscheidung à la:if (BOOLvariable == TRUE) boolvariable = true; else boolvariabble = false;?
Gruß,
Dong
-
Ich glaub eine Rundungsfunktion gibt es nicht. Zumindest habe ich nie eine gefunden. Du kannst sie aber selber schreiben:
template<class ReturnType, class RoundType> ReturnType RoundIt(RoundType x, int nDecimals) { RoundType rtHalf = static_cast<RoundType>(0.5); rtHalf *= (x < 0 ? -1 : 1); x *= pow(static_cast<RoundType>(10), nDecimals); x += rtHalf; x *= pow(static_cast<RoundType>(10), -nDecimals); return static_cast<ReturnType>(x); }Gibt glaub ich noch effektivere.
zu deiner Frage im zweiten Post *danke Vorschaufenster*
BOOL B /*= TRUE or FALSE*/; bool b = static_cast<bool>(B);sollte eigentlich reichen.
kannst aber auf folgendes tun:bool b = (B ? true : false);Grüssli
Grüssli
-
Dravere schrieb:
Ich glaub eine Rundungsfunktion gibt es nicht. Zumindest habe ich nie eine gefunden. Du kannst sie aber selber schreiben:
...
Gibt glaub ich noch effektivere.
Sowas, keine Rundungsfunktion!
Naja, für positive rationale Zahlen ist mir noch was kürzeres eingefallen:shortwert = static_cast<short>(floatwert + 0.5);Aber sobald negative Zahlen berücksichtigt werden sollen, reicht dieser Einzeiler wohl nicht mehr, da ist Dein Template wohl doch praktischer. Danke!
Dravere schrieb:
kannst aber auf folgendes tun:
bool b = (B ? true : false);Das sieht tatsächlich schön kompakt aus.

-
In Visual Studio 2005 gibt es die "Error List" da kann man dann einzeln nach Error, Warning und Messages sortieren. Das hilft schon ungemein, wenn man von Warnungen nur so überschüttet wird

Und für so kleine Sachen wie BOOL zu bool kann man sich ja ein kleines Macro schreiben. Dann muss man nicht immer so eine if-Verzweigung einbauen. So helf ich mir halt schon mal hin und wieder aus.
bis denn
-
dong schrieb:
Gut, ich schränke diese Aussage auf den Fall ein, dass man in >100 Warnungen einen Error suchen muss.

Sorry, dann kannst du einfach nicht mit deinem Werkzeug umgehen. Es gibt eine Todo-Liste (ab VC++2003, vielleich auch 2002?) in der auch die Warnings und Errors aufgelistet werden. Diese Liste kann man mit einem Mouseclick auf den Tabellenkopf sortieren. Evtl. gibts auch einen Filter? (weiß ich nicht) Und wer diese Liste nicht kennt: man kann auch alternativ (wenn mans so will) mit Strg+F im Ausgabefenster nach Errors suchen.
-
Mr.Yellow schrieb:
In Visual Studio 2005 gibt es die "Error List" da kann man dann einzeln nach Error, Warning und Messages sortieren. Das hilft schon ungemein, wenn man von Warnungen nur so überschüttet wird

Prima, das ist genau das, was ich brauchte, danke!

Artchi schrieb:
dong schrieb:
Gut, ich schränke diese Aussage auf den Fall ein, dass man in >100 Warnungen einen Error suchen muss.

Sorry, dann kannst du einfach nicht mit deinem Werkzeug umgehen.
Das habe ich auch nie behauptet, sonst würde ich ja hier nicht fragen (siehe Signatur...).
[und jetzt behaupte ja niemand, dass die MSDN Dokumentation zu Visual Studio besonders übersichtlich ist...]Gruß,
Dong