Hallo, ich stehe auf dem Schlauch. Wieso erkennt der Compiler im oberen Teil nicht einen 16 bit wert? Beides compiliert ohne Hinweis bzw. Fehler.
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
|
Anzeige
|
if (uint16_t) --blink) == 0 Ok. if(--blink == 0 ) nicht ok?Hallo, ich stehe auf dem Schlauch. Wieso erkennt der Compiler im oberen Teil nicht einen 16 bit wert? Beides compiliert ohne Hinweis bzw. Fehler.
Gast
#3863241
Dir ist schon bewusst, dass der erste Teil gar nicht compiliert wird, weil du den über den Preprocessor auskommentierst?
Gast
#3863243
Jörg Esser schrieb: > #if 0 ??? 0 wird niemals 1 !!! Ingo schrieb: > Jörg Esser schrieb: >> #if 0 > ??? 0 wird niemals 1 !!! Wenn Null besonders groß ist, ist es fast soviel, wie ein bisschen Eins.
Gast
#3863254
Er meint eine der beiden Versionen! #if 0 ODER #if 1
Gast
#3863256
nochmal: Die Frage ist ziemlich scheiße gestellt... Der Compiler erkennt was nicht?? Was meinst du damit?...
Gast
#3863258
ich schrieb: > nochmal: Die Frage ist ziemlich scheiße gestellt... Der Compiler erkennt > was nicht?? Was meinst du damit?... Feiner hätte ich es nicht ausdrücken können. Jörg Esser schrieb: > Wieso erkennt der Compiler im oberen Teil > nicht einen 16 bit wert? Woran merkst Du das? Für die Ausführung des dieses Beispielcodes ist das unbedeutent.
Gast
#3863279
Moment mal, er hat "beides" geschrieben, höcshtwahrscheinlich hat er #if 0 und #if 1 probiert. Jörg Esser schrieb: > ich stehe auf dem Schlauch. Wieso erkennt der Compiler im oberen Teil > nicht einen 16 bit wert? Wie kommst du darauf? >Beides compiliert ohne Hinweis bzw. Fehler. Natürlich. Beides erzeugt auch identischen Code. mfg.
Gast
#3863492
Jörg Esser schrieb: > #if 0 > #else > #endif Das ist so ziemlich die beschissenste art etwas "auszukommentieren"! Kaj schrieb: > Das ist so ziemlich die beschissenste art etwas "auszukommentieren"! Keep cool. Bei Testcases wie hier ist das völlig normal. Jörg Esser schrieb: > ich stehe auf dem Schlauch. Ich auch ... > Wieso erkennt der Compiler im oberen Teil > nicht einen 16 bit wert? ... weil ich mit diesem Satz nichts anfangen kann.
Gast
#3863506
Kaj schrieb im Beitrag #3863492 > > Das ist so ziemlich die beschissenste art etwas "auszukommentieren"! Ok. Ich schlage vor: Du schreibst jetzt, wie du Code kurzfristig "rausnehmen" würdest und ich sag dir nachher wieso die Methode vomTO besser ist.
Gast
#3863520
Kaj schrieb: > Jörg Esser schrieb: >> #if 0 >> #else >> #endif > > Das ist so ziemlich die beschissenste art etwas "auszukommentieren"! Alternativvorschlag? Mir fallen spontan mehrere Gründe ein, weshalb das hier durchaus in Ordnung ist... Aber lass du mal hören!
Gast
#3863588
Kaj schrieb: > Das ist so ziemlich die beschissenste art etwas "auszukommentieren"! Deshalb erkennen brauchbare Editoren wie der Vim das ja auch und färben es entsprechend in Kommentarfarbe ein ;) Vim! schrieb: > Editoren Editoren gibt es nicht. Editor ist Singularetantum, da es nur einen Editor gibt. Wie? Ei, wie heisst der denn? mfg. Thomas Eckmann schrieb: > Vim! schrieb: >> Editoren > > Editoren gibt es nicht. Editor ist Singularetantum, da es nur einen > Editor gibt. > Wie? Ei, wie heisst der denn? > > mfg. Der Duden ist anderer Meinung. http://www.duden.de/rechtschreibung/Editor_Herausgeber Vermutung ins Blaue: Compileroptimierung Für die Variable gilt immer 0 <= blink <= 24. Kann also sein, dass der Compiler das in der ersten Version platzsparend in ein uint8_t umwandelt. Bei der zweiten Variante hingegen castest du explizit wieder zu uint16_t -> keine Optimierung da uint16_t explizit gefordert. Thomas Eckmann schrieb: > Editoren gibt es nicht. Editor ist Singularetantum, da es nur einen > Editor gibt. Der Duden lässt das Plural zu, das ist deine Aussage rein grammatikalisch wohl nicht ganz zutreffend. Bei der hier etwas deplacierten Bedeutung im Verlagswesen klappt das auch nicht, denn selbstredend gibt es mehrere Editoren/Herausgeber, andernfalls wäre die Medienlandschaft noch trister als sie ohnehin schon ist. Detlef Kunz schrieb: > Der Duden ist anderer Meinung. Auch der Duden ist nicht fehlerfrei. Daniel H. schrieb: > Bei der zweiten Variante hingegen castest du explizit wieder > zu uint16_t -> keine Optimierung da uint16_t explizit gefordert. Nein. Das gibt beide Male den gleichen Code. mfg. A. K. schrieb: > Der Duden lässt das Plural zu, das ist deine Aussage rein > grammatikalisch wohl nicht ganz zutreffend. Bei der hier etwas > deplacierten Bedeutung im Verlagswesen klappt das auch nicht, denn > selbstredend gibt es mehrere Editoren/Herausgeber, andernfalls wäre die > Medienlandschaft noch trister als sie ohnehin schon ist. Nein. Es gibt nur einen Editor. Alles andere ist Spielkram. mfg. Hmm bei mir gibt es einen Unterschied. Die Variable wird scheinbar anders heruntergezählt. Ich werde mal schaun was mein gcc für einen assembler code ausspuckt. Sorry für meine Laienhaften Ausführungen aber das is für mich nur Hobby bzw. Liebhaberei ;) Thomas Eckmann schrieb: > A. K. schrieb: >> Der Duden lässt das Plural zu, das ist deine Aussage rein >> grammatikalisch wohl nicht ganz zutreffend. Bei der hier etwas >> deplacierten Bedeutung im Verlagswesen klappt das auch nicht, denn >> selbstredend gibt es mehrere Editoren/Herausgeber, andernfalls wäre die >> Medienlandschaft noch trister als sie ohnehin schon ist. > > Nein. Es gibt nur einen Editor. Alles andere ist Spielkram. > > mfg. Autor: Thomas Eckmann (Firma: Thomas Eckmann Informationst.) (thomase) Hmm, was sind den "thomase" ? Doch nicht etwa die Mehrzahl von dir. ;) Detlef Kunz schrieb: > Autor: Thomas Eckmann (Firma: Thomas Eckmann Informationst.) (thomase) > Hmm, was sind den "thomase" ? Doch nicht etwa die Mehrzahl von dir. ;) Doch. Normalerweise hast du mich mit Ihr bzw. Euch anzureden. Jetzt mach hier nicht so einen Wind. Du verstehst das nur nicht. Das bezog sich einzig auf unseren Linuxfreund, der hier mit seinem vim angeben wollte. Richtige Linuxuser, also die Masochisten unter den Linuxusern, naja eigentlich sind das ja alles Masochisten, aber egal. Also für die richtigen, die knallharten Linuxuser gibt es nur einen Editor. Ich hatte ja befürchtet, dass das keiner versteht und extra einen Zaunpfahl zum winken eingebaut: Wie? Ei,... mfg. Jörg Esser schrieb: > Hmm bei mir gibt es einen Unterschied. Die Variable wird scheinbar > anders heruntergezählt. Da musst du dich irren. Es gibt 2 Regeln: 1. Der Compiler hat immer Recht. 2. Trifft dies ausnahmsweise nicht zu, tritt automatisch Regel 1 in Kraft. Mit anderen Worten: Was der Compiler macht, ist richtig. Und er gehorcht dir aufs Wort. Und zwar richtig wörtlich. Manchmal gibt es allerdings Verständigungsprobleme. Dann kommen die beiden Regeln zum Zuge. Aber das ist hier nicht der Fall. Der zählt runter oder besser er lässt runterzählen. Da kann er gar nicht anders. mfg.
Gast
#3863682
>Thomas Eckmann (Firma: Thomas Eckmann Informationst.) (thomase)
Bist du einer dieser fahrenden Computerbeschwörer deren Kenntnisse man
sich dann und wann an nicht funktionierenden SOHO Installationen
überzeugen darf? Zumindest ereilt mich an dieser Stelle so ein
Eindruck...
MfG
johnny schrieb: > Bist du einer dieser fahrenden Computerbeschwörer deren Kenntnisse man "von deren Kenntnissen" heisst das. Deine Kommataste funktioniert auch nicht. Das andere erzähl ich dir, wenn du mir erzählst, was du für eine Flitzpiepe bist. mfg.
Gast
#3863688
:P also ja. Na dann wünsch ich dir noch viel Spaß. MfG P.S.: Haste recht, ich möchte ein "n" kaufen. johnny schrieb: > Na dann wünsch ich dir noch viel Spaß. Danke. Von dem, was ich mache, da träumst du nur von. mfg.
Gast
#3863692
Jörg Esser schrieb: > Hmm bei mir gibt es einen Unterschied. Die Variable wird scheinbar > anders heruntergezählt. > Ich werde mal schaun was mein gcc für einen assembler code ausspuckt. > > Sorry für meine Laienhaften Ausführungen aber das is für mich nur Hobby > bzw. Liebhaberei ;) Pack doch einfach mal das .lss File hier rein, dann können wir sehen wie unterschiedlich das Ergebnis ausfällt.
Gast
#3863694
Thomas Eckmann schrieb: > Von dem, was ich mache, da träumst du nur von. Da gratuliere ich recht herzlich und lasse das mal so stehen :) MfG Disassemblier' das Ergebnis, alles andere ist doch Raterei :) Jörg Esser schrieb: > Wieso erkennt der Compiler im oberen Teil nicht > einen 16 bit wert? Weil da kein 16-Bit Wert im "oberen Teil" ist: > #include <avr/io.h> > #include <inttypes.h> Sven B. schrieb: > Disassemblier' das Ergebnis, alles andere ist doch Raterei :) Das ist keine Raterei. Das Casten ändert gar nichts. Und beides erzeugt identischen Code. Mehr kann man zu diesem Codefetzen nicht sagen. Es sei denn er zeigt den ganzen Code. Vielleicht ist es ja doch Raterei. mfg. Thomas Eckmann schrieb: > Sven B. schrieb: >> Disassemblier' das Ergebnis, alles andere ist doch Raterei :) > > Das ist keine Raterei. Das Casten ändert gar nichts. Und beides erzeugt > identischen Code. Naja, wir wissen ja nichtmal welcher Compiler das ist, von daher würde ich sagen, mal schauen schadet sicher nichts. Thomas Eckmann schrieb im ganzen Thread hier:
> ...habedahabedahabeda...
Was war denn mit dir gestern Abend los?
Es ist nicht gerade gesund, sich vorm Schlafen gehen so aufzuregen.
Entspann mal!
Gast
#3863792
Jörg Esser schrieb: > Die Variable wird scheinbar > anders heruntergezählt. Und woran erkennst Du das? Thomas Eckmann schrieb: > Das bezog sich einzig auf unseren Linuxfreund, der hier mit seinem vim > angeben wollte. Eclipse CDT kann das auch (unzutreffende #ifdef ausgrauen). Sogar wenn man es unter Windows benutzt. Macht jede ordentliche C/C++ IDE. Kaj schrieb: > Jörg Esser schrieb: >> #if 0 >> #else >> #endif > > Das ist so ziemlich die beschissenste art etwas "auszukommentieren"! Mir fällt keine bessere ein, dafür aber mehrere, die schlechter sind. Hallo, kann es sein, dass die erste Variante Blink mit 0 vergleicht, was 0 ergibt und dieses dann dekrementiert ? Die zweite hat ein paar züsätzliche Klammern.... Gruß, Michael
Gast
#3863881
Michael Appelt schrieb: > Hallo, > > kann es sein, dass die erste Variante Blink mit 0 vergleicht, was 0 > ergibt und dieses dann dekrementiert ? Die zweite hat ein paar > züsätzliche Klammern.... > > Gruß, > Michael Nein: http://en.cppreference.com/w/c/language/operator_precedence Jörg Esser schrieb: > Hallo, > > ich stehe auf dem Schlauch. Wieso erkennt der Compiler im oberen Teil > nicht einen 16 bit wert? Beides compiliert ohne Hinweis bzw. Fehler. >
Ich könnte mir vorstellen, dass der Compiler optimiert. Da nur 0..24 als Wert vorkommt, reicht es, diesen Wert als 8Bit zu speichern (AVR 8Bit Controller), dafür ist nur ein 8Bit-Register notwendig - im oberen Fall. Unten castest du explizit zu uint16_t, der Compiler gehorcht aufs Wort und belegt 16Bit. Daniel V. schrieb: > Ich könnte mir vorstellen, dass der Compiler optimiert. > Da nur 0..24 als Wert vorkommt, reicht es, diesen Wert als 8Bit zu > speichern (AVR 8Bit Controller), dafür ist nur ein 8Bit-Register > notwendig - im oberen Fall. > Unten castest du explizit zu uint16_t, der Compiler gehorcht aufs Wort > und belegt 16Bit. Klingt sinnvoll. Bei komplett abgeschalteter Optimierung sollte dann das gleiche Ergebnis herauskommen. Daniel V. schrieb: > Ich könnte mir vorstellen, dass der Compiler optimiert. > Da nur 0..24 als Wert vorkommt, [...] Diese Annahme ist falsch, bzw. ein Compiler, der so eine Annahme oder darauf basierende Optimierungen macht, ist nicht korrekt. Beim Aufruf von main ist der Wert der Variablen nämlich nicht bekannt: Ein anderes Modul könnte Code vor main ausführen und blink auf einen anderen Wert setzen. Ich glaube kaum, dass Jörg mit dem GCC einen Unterschied zwischen den beiden Varianten feststellen konnte. Ich hab's gerade für verschiedene Compiler-Versionen, Optimierungsstufen und AVR-Typen ausprobiert. Der vom Compiler erzeugte Assemblercode hängt in allen Fällen nicht davon ab, welcher Zweig im #if-#else-#endif aktiv ist. Ergebnis:
Durchgenudelt mit diesem Skript:
@Jörg: Folgendes
tut nicht immer das, was du damit vermutlich bezweckst, nämlich PORTB0 toggeln und sonst nichts. Wenn nämlich irgendein Pin von Port B als Eingang genutzt wird, dann wird mit der obigen Anweisung je nach Eingangspegel der Pullup-Widerstand für diesen Eingang aktiviert bzw. deaktiviert, was wahrscheinlich nicht beabsichtig ist. Besser:
Noch besser:
Falls der von dir eingesetzte AVR ein etwas neuerer ist, der über das Pin-Toggle-Feature verfügt, noch besser:
Johann L. schrieb: > Daniel V. schrieb: >> Ich könnte mir vorstellen, dass der Compiler optimiert. >> Da nur 0..24 als Wert vorkommt, [...] > > Diese Annahme ist falsch, bzw. ein Compiler, der so eine Annahme oder > darauf basierende Optimierungen macht, ist nicht korrekt. > > Beim Aufruf von main ist der Wert der Variablen nämlich nicht bekannt: > Ein anderes Modul könnte Code vor main ausführen und blink auf einen > anderen Wert setzen. Prinzipiell hast du Recht. Dennoch, so wie es da steht, ohne sonstige Funktionen etc. könnte ich sogar noch mehr optimieren und sagen: blink wird NIE 0, also kann ich alles weglassen. Es fehlt nämlich die while(1)-Schleife. Ich muss mich entschuldigen. Der gepostete Code funktioniert bei beiden Varianten. Ich denke es liegt mal wieder zu 100% am Typ vor der Kiste. Ich kann den Fehler nicht mehr reproduzieren. Sorry fürs Steinewerfen. Ihr dürft jetz draufhauen :)
Gast
#3864378
Yalu X. schrieb: > Falls der von dir eingesetzte AVR ein etwas neuerer ist, der über das > Pin-Toggle-Feature verfügt, noch besser: > PINB |= 1 << PB0; Bloss nicht, da toggeln u.U. mehr Pins als du willst. Richtig ist
Da bin ich auch schon drauf reingefallen, und man sieht es erst beim 100. Drueberlesen, da man ja darauf konditioniert ist, bei einer Operation auf nur einem Portbit irgendwelche & und | zu sehen. Tassilo schrieb: > Bloss nicht, da toggeln u.U. mehr Pins als du willst. Richtig ist > PINB = 1<<PB0; Das geht auch, erfordert aber zwei Maschineninstruktionen statt einer. Dieses
sieht zwar auf den ersten Blick falsch aus, ist es aber nicht, da es vom Compiler in ein SBI umgesetzt wird. Auch das SBI sieht an dieser Stelle falsch aus (da man dahinter einen Read-Modify-Write-Ablauf vermutet), ist es aber nicht. In den Datenblättern der entsprechenden AVRs wird explizit der SBI-Befehl als einen Möglichkeit für die Toggle-Funktion genannt.
Gast
#3864436
Gerade nachgesehen, hast recht, falsche Erinnerung. Im Problemfall wurden bei mir auch mehrere Bits gleichzeitig getoggelt, dann wird da wohl kein SBI mehr draus. Ich sollte nix schreiben ohne nochmals ins Datenblatt zu schauen :-/
Gast
#3864544
Johann L. schrieb: > Daniel V. schrieb: >> Ich könnte mir vorstellen, dass der Compiler optimiert. >> Da nur 0..24 als Wert vorkommt, [...] > > Diese Annahme ist falsch, bzw. ein Compiler, der so eine Annahme oder > darauf basierende Optimierungen macht, ist nicht korrekt. > > Beim Aufruf von main ist der Wert der Variablen nämlich nicht bekannt: > Ein anderes Modul könnte Code vor main ausführen und blink auf einen > anderen Wert setzen. In C gibt es offiziell keinen Code vor main(). Rolf Magnus schrieb: > In C gibt es offiziell keinen Code vor main(). Für nicht-hosted Programme schon: > The name and type of the function called at program startup > in a freestanding environment [is implementation defined].
Gast
#3864691
So kann man code vor der main() ausführen:
Geht auch, wenn die my_init() funktion in einer anderen Datei liegt, als main(). @Yalu Vielen Dank für den Hinweis. In meinem Fall nutze ich nur den tiny85 und der hat nur einen Port wo ich ein paar Pins auf Ein bzw. Ausgang geschaltet habe. Ich sollte meine alten Code mal danach absuchen. Woran erkenne ich die Unterstützung der neuen Toggle Feature? Im Datenblatt zu finden? Ich denke der Tiny ist alt wird wohl nur bei xmega etc geben? Danke auch an den Rest für die Hilfe. Jörg Esser schrieb: > Woran erkenne ich die Unterstützung der neuen Toggle Feature? > Im Datenblatt zu finden? Ja. Jörg Esser schrieb: > Woran erkenne ich die Unterstützung der neuen Toggle Feature? Ganz so neu ist das auch wieder nicht. > Im Datenblatt zu finden? Ja. Bei denen, die toggeln können, findet sich dieser kurze Abschnitt im Datenblatt:
> Ich denke der Tiny ist alt wird wohl nur bei xmega etc geben?
Doch, der ATtiny85 ist relativ neu und hat dieses Feature, der ältere
ATtiny13 aber auch schon. Ich glaube sogar, das gilt für alle ATtiny,
die derzeit hergestellt werden.
Gast
#3865283
Thomas Eckmann schrieb: > Das bezog sich einzig auf unseren Linuxfreund, der hier mit seinem vim > angeben wollte. Achje. Ich habe lediglich andeuten wollen, dass es Gang und Gäbe ist Code mit #if 0 auszukommentieren. Denn sogar gängige Editoren (Ja Editoren) unterstützen das. Du bist hier derjenige, der einen Linux-Flame draus macht. Antwort schreibenBitte melde dich an, um einen Beitrag zu schreiben. |
Anzeige
|