www.mikrocontroller.net

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


Autor: Sam (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#define DURCH4 2
unsigned long b
unsigned long a
a = (b>>DURCH4);

Autor: Marius Wensing (mw1987)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#define SHIFT 2
wenn du zb um 2 Stellen schieben wollst.

MfG
Marius

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Sam (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sorry ich meinte natürlich z.b.

#define SHIFT 3

Autor: Sam (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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);

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Sam (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Sam (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ixh habe

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

gerade ausprobiert, bringt aber die gleiche Meldung

Autor: Johnny B. (johnnyb)
Datum:

Bewertung
0 lesenswert
nicht 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. ;-)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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
#include <avr/io.h>
#include <math.h>

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

int main()
{
  int i;
  i = 5 << SHIFT;
}
compilier mit dem gcc einwandfrei. Verwundert auch nicht weiter, denn es 
entspricht den C-Regeln.

Autor: sven s. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.