Forum: Mikrocontroller und Digitale Elektronik PIC C18 Fehlermeldung: [2060] shift expression has no effect?


von Igor M. (bastel-wastel)


Lesenswert?

Hallo allerseits,
hab ein kleines Problem mit einer Fehlermeldung (warning) mit dem C18 
Compiler.

(PIC18F2550)
1
#define bit_set(var,bitnr)   ((var) |= 1 << (bitnr)) // Einzelnes Bit setzen
2
3
main
4
{
5
unsigned char Messprotokoll[10];      
6
...
7
bit_set(Messprotokoll[4],0);
8
oder
9
bit_set(ADCON0,0);
10
...
11
}

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.

von yalu (Gast)


Lesenswert?

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.

von Igor M. (bastel-wastel)


Lesenswert?

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.

von yalu (Gast)


Lesenswert?

> "<<" 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.

von Siegfried S. (dieleena)


Lesenswert?

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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.