Re: Neue Development Firmware (RF.01.35 - Weihnachts-Update)
Verfasst: Fr 13. Jan 2017, 00:23
Hallo Nibbels!
Danke vielmals für die sehr gute Erklärung .
Eine Anmerkung hätte ich aber noch:
Die redefinierten String-Konstanten für die Oberfläche sind dabei ein vernachlässigbares Übel. Richtig böse können Overflows oder Unitialized Memory Warnings werden, da hier plötzlich ganz andere als die erwarteten / angegebenen Werte verwendet werden. Uninitialisierte Pointer gehören ebenfalls dazu. Uninitialisierte Variablen sind deshalb so böse, da hier der Programmierer meistens vom Wert 0 ausgeht oder kein Initialisierungszweig durchlaufen wurde und der Wert deshalb vom letzten Zustand des Speichers / Stacks abhängt. Bsp.: Es wird die Variable für einen Z-Offset gelesen. Erwarten würde der Entwickler den Wert 0 (mm) da die Variable nicht explizit initialisiert war. Vorher stand an der Speicheradresse zuletzt aber 42 drin. Da die Variable nicht initialisiert wurde, wird jetzt mit 42 (mm) gearbeitet anstatt 0. Und das Ganze tritt dann auch noch zur Laufzeit völlig willkürlich und nicht reproduzierbar auf. NICHT GUT.
Und man sollte sich nicht darauf verlassen, daß der Stack / der Speicher immer schön sauber mit 0x0 initialisiert ist.
Deshalb halte ich es für so wichtig, die Warnings mit den uninitialisierten Variablen wegzubekommen --> sie können dann nicht mehr die Ursache für das unterschiedliche Verhalten derselben Firmware auf unterschiedlichen Druckern sein.
' (increment<0) ': Hier ist 'increment' eine 'unsigned' variable (ohne Vorzeichen). Der Wert kann nie < 0 werden. Bei unsigned char ist der '0 -1' nicht '-1' sondern 255. --> Hier wird immer nur der else Zweig durchlaufen ...
Hilft das weiter?
Viele Grüße und sorry für's zutexten ...
Danke vielmals für die sehr gute Erklärung .
Eine Anmerkung hätte ich aber noch:
Doch, für Entwickler ist dies essentiell (zum. für mich). Der Compiler zeigt mit den Warnings an, daß evtl. sehr essentielle Probleme, Mißverständnisse, Denkfehler oder Laufzeitprobleme auftreten können, welche die Entwickler nicht bedacht haben könnten. Der compilierte Code funktioniert aber oft nicht so, wie es sich der Entwickler vorgestellt hat.Die Aktion ist tatsächlich ohne tatsächlichen Nutzen
Die redefinierten String-Konstanten für die Oberfläche sind dabei ein vernachlässigbares Übel. Richtig böse können Overflows oder Unitialized Memory Warnings werden, da hier plötzlich ganz andere als die erwarteten / angegebenen Werte verwendet werden. Uninitialisierte Pointer gehören ebenfalls dazu. Uninitialisierte Variablen sind deshalb so böse, da hier der Programmierer meistens vom Wert 0 ausgeht oder kein Initialisierungszweig durchlaufen wurde und der Wert deshalb vom letzten Zustand des Speichers / Stacks abhängt. Bsp.: Es wird die Variable für einen Z-Offset gelesen. Erwarten würde der Entwickler den Wert 0 (mm) da die Variable nicht explizit initialisiert war. Vorher stand an der Speicheradresse zuletzt aber 42 drin. Da die Variable nicht initialisiert wurde, wird jetzt mit 42 (mm) gearbeitet anstatt 0. Und das Ganze tritt dann auch noch zur Laufzeit völlig willkürlich und nicht reproduzierbar auf. NICHT GUT.
Und man sollte sich nicht darauf verlassen, daß der Stack / der Speicher immer schön sauber mit 0x0 initialisiert ist.
Deshalb halte ich es für so wichtig, die Warnings mit den uninitialisierten Variablen wegzubekommen --> sie können dann nicht mehr die Ursache für das unterschiedliche Verhalten derselben Firmware auf unterschiedlichen Druckern sein.
Code: Alles auswählen
sketch\ui.cpp:2542:149: warning: comparison of unsigned expression < 0 is always false [-Wtype-limits]
#define INCREMENT_MIN_MAX(a,steps,_min,_max) if ( (increment<0) && (_min>=0) && (a<_min-increment*steps) ) {a=_min;} else { a+=increment*steps; if(a<_min) a=_min; else if(a>_max) a=_max;};
Nö. Ich hatte nur den Typ char gesehen, und dann daraus '\x0' gemacht, das es das 0-Byte char ist. 0 ist absolut gleichwertig (ebenso 0x0).Ist '\x0' hier besser als eine normale 0?
Hilft das weiter?
Viele Grüße und sorry für's zutexten ...