Forum: Mikrocontroller und Digitale Elektronik Kann man in c auch mit defines schieben?


von Sam (Gast)


Lesenswert?

Hallo,
kann man in c auch mit defines schieben.
Im folgenden ein kurzes Beispiel, welches die untenstehende 
Fehlermeldung bringt.
Falls diese problem nicht zu lösen ist, gibt es andere Möglichkeiten als 
nur mit Konstanten zahlen zu schieben?

#define SHIFT
unsigned long b
unsigned long a


a = (b>>SHIFT)  // diese Zeile gibt bei mir die //fehlermeldung 
:D:\moogsoft\extlvdt\src\extlvdsyc.c(398): error:  //#31: expression 
must have integral type (KEIL compiler)

Danke!

Gruß
Samuel

von Stefan B. (stefan) Benutzerseite


Lesenswert?

#define DURCH4 2
unsigned long b
unsigned long a
a = (b>>DURCH4);

von Marius W. (mw1987)


Lesenswert?

1
#define SHIFT 2
wenn du zb um 2 Stellen schieben wollst.

MfG
Marius

von Karl H. (kbuchegg)


Lesenswert?

Sam schrieb:
> Hallo,
> kann man in c auch mit defines schieben.

Nein.
Und das liegt daran, dass #define nicht das macht was du denkst das es 
macht.

#define ist einfach nur die Anweisung an den Präprozessor im 
nachfolgenden Text Textersetzungen vorzunehmen. So wie wenn du in deinem 
Editor die Editor Funktion Suchen&Ersetzen benutzen würdest.


> #define SHIFT

das legst fest, dass der Text SHIFT durch nichts zu ersetzen ist.

> a = (b>>SHIFT)  // diese Zeile gibt bei mir die //fehlermeldung

dann mach mal die Textersetzung. Ersetzte den Text SHIFT durch nichts.
Dann steht da

  a = (b>>)  // diese Zeile gibt bei mir die //fehlermeldung

und das ist kein gültiges C


C-Buch kaufen und durcharbeiten!

von Sam (Gast)


Lesenswert?

sorry ich meinte natürlich z.b.

#define SHIFT 3

von Sam (Gast)


Lesenswert?

wenn ich folgendes in meinem programm schreibe bekomme ich trotzdem die 
fehlermeldung "error:  #31: expression must have integral type"
woran liegt das???

#define SHIFT 3

unsigned long b
unsigned long a


a = (b>>SHIFT);

von Karl H. (kbuchegg)


Lesenswert?

Sam schrieb:
> wenn ich folgendes in meinem programm schreibe bekomme ich trotzdem die
> fehlermeldung "error:  #31: expression must have integral type"

höchst wahrscheinlich an einem Tippfehler in deinem RICHTIGEN Code. 
Oder auch an etwas völlig anderem.

Poste deinen richtigen Code und hör auf hier im Forum Code direkt 
einzutippen. Wozu das führt hast du ja jetzt zur Genüge gesehen. Wir 
gehen auf Fehler ein, die du gar nicht gemacht hast.

von Sam (Gast)


Lesenswert?

Ich habe gerade festgestellt, dass

#define SHIFT 3 //funktioniert


//der Originalcode ist aber:
#define SHIFT log(32)/log(2)  //Fehlermeldung: "expression must have 
integral type"


Wie kann ich das beheben?

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Formal: Klammern, was bei Makros grundsätzlich zu empfehlen ist, und in 
einen integralen Typ (Ganzzahl) casten

#define SHIFT ((unsigned long)(log(32)/log(2)))
oder
#define SHIFT 5

Ob das Sinn macht, musst du entscheiden.

von Sam (Gast)


Lesenswert?

Ixh habe

#define SHIFT ((unsigned long)(log(32)/log(2)))

gerade ausprobiert, bringt aber die gleiche Meldung

von Johnny B. (johnnyb)


Lesenswert?

Machs doch erst mal ohne defines und wenn es sich kompillieren lässt und 
funktioniert, dann erst aus den gewünschten Teilen ein define.
Ein define ersetzt wirklich nur Text bevor dieser kompilliert wird und 
macht sonst keine Hexerei.

Die Hexerei kommt erst ins Spiel, wenn Du noch die speziellen Features 
des Preprocessors brauchst wie z.B. ## um Strings zusammenzusetzen. ;-)

von Karl H. (kbuchegg)


Lesenswert?

Sam schrieb:
> Ixh habe
>
> #define SHIFT ((unsigned long)(log(32)/log(2)))
>
> gerade ausprobiert, bringt aber die gleiche Meldung

Und nochmal die Aufforderung: poste richtigen Code
1
#include <avr/io.h>
2
#include <math.h>
3
4
#define SHIFT ((unsigned long)(log(32)/log(2)))
5
6
int main()
7
{
8
  int i;
9
  i = 5 << SHIFT;
10
}
compilier mit dem gcc einwandfrei. Verwundert auch nicht weiter, denn es 
entspricht den C-Regeln.

von sven s. (Gast)


Lesenswert?

Ich kanns mir hier jetzt nicht verkneifen.
http://www.de.ioccc.org/2004/anonymous.c

Übelste Präprozessor Misshandlungen gehören hier wohl zum Alltag :-)

PS: Die Seite ist sonst auch ganz Lustig http://www.de.ioccc.org

Gruß Sven

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.