Kann man in c auch mit defines schieben?

Gast #1934847
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
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!
Gast
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);
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.
Gast
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?
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. ;-)
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 15 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.