Datum: 26.04.2008 15:37
Hallo allerseits, hab ein kleines Problem mit einer Fehlermeldung (warning) mit dem C18 Compiler. (PIC18F2550)
#define bit_set(var,bitnr) ((var) |= 1 << (bitnr)) // Einzelnes Bit setzen main { unsigned char Messprotokoll[10]; ... bit_set(Messprotokoll[4],0); oder bit_set(ADCON0,0); ... } |
Fehlermeldung: D:\PIC_Soft\main.c:347:Warning [2060] shift expression has no effect Und zwar taucht die Meldung auf, wenn ich das Bit 0 einer Variablen abfragen will. C18_User_Guide meint dazu: 2060: shift expression has no effect Shifting a value by zero bits has no effect on the value of the expression. Wieso sollte das Setzen/Rücksetzen des Bit 0 nichts am Wert ändern? Gezählt wird doch von Bit0...Bit7. Oder wo hab ich meinen Denkfehler? Wenn ich mir die Variablen im Debugger anschau, dann werden die richtigen Bits schon gesetzt, aber das warning wird ja nicht zum Spaß da sein. Wäre klasse, wenn mir jemand nen Tipp geben könnte.
Datum: 26.04.2008 15:50
Die Anweisung als Ganzes hat natürlich schon einen Effekt, aber nicht die Shift-Operation. Ob du x |= 1<<0; oder x |= 1; schreibst, ist das Gleiche, also ist die <<-Operation eigentlich überflüssig, und der Compiler wittert fälschlicherweise ein Versehen von deiner Seite. Vielleicht gibt es ja eine Compiler-Option, mit der man alle 2060-Warnungen abschalten kann.
Datum: 26.04.2008 16:18
Danke für deine Antwort. Zu meiner Schande muss ich gestehen, dass ich das #define übernommen habe, ohne dessen Ablauf zu durchdenken. Also dann aber jetzt: "<<" verschiebt hier eine 1 um 0 Stellen nach oben, richtig? x |= 1<<0; Und weil C18 dieses Shift für überflüssig hält gibt er ne Warnung aus!? OK, in diesem Fall kann ich mit der Warnung beim Compilieren leben. Danke für die Hilfe.
Datum: 26.04.2008 16:36
> "<<" verschiebt hier eine 1 um 0 Stellen nach oben, richtig?
So isses. Der Compiler sieht ja den Code erst, nachdem der
Präprozessor darin alle Makros (wie bit_set) expandiert hat. Und da
taucht nun einmal dieses seltsam anmutende 1<<0 auf.
Da solche Makros wie bit_set übliche Vorgehensweise sind, halte ich
die beschriebene Warnung nicht für sehr sinnvoll, da sie, wenn sie in
großer Anzahl auftritt, den Blick auf die wirklich ernstzunehmenden
Meldungen versperrt. Aber wie gesagt, vielleicht kann man sie ja
deaktivieren.
Datum: 27.06.2008 12:44
Hallo, Bin Neuling bei der C18 Programmierung. Hatte das gleiche Problem. Durch eine andere habe ich das Problem beseitig. Mein Fehler war, das ich den Linker Script aus dem falschem Verzeichnis genutzt hatte. Nutze jetzt die Dateien aus mcc18\lkr.. Gruß Siegfried
Antwort schreiben
Die Angabe einer Email-Adresse ist freiwillig. Wenn Sie automatisch per Email über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.
Wichtige Regeln - erst lesen, dann posten!
- Suchfunktion und Betreffsuche benutzen - vielleicht gibt es schon einen ähnlichen Beitrag
- Aussagekräftigen Betreff wählen
- Im Betreff angeben um welchen Controllertyp es geht (AVR, PIC, ...)
- Groß- und Kleinschreibung verwenden
- Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang
- JPEG-Dateien (.jpg) nur für Fotos und Scans verwenden
- Schaltpläne, Screenshots usw. als PNG oder GIF anhängen
Formatierung (mehr Informationen...)
- [c]C-Code[/c]
- [avrasm]AVR-Assembler-Code[/avrasm]
- [pre]vorformatierter Text (z.B. Code in anderen Sprachen)[/pre]
- [math]Formel in LaTeX-Syntax[/math]
- [[Titel]] - Link zu Artikel