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
#define DURCH4 2 unsigned long b unsigned long a a = (b>>DURCH4);
1 | #define SHIFT 2
|
wenn du zb um 2 Stellen schieben wollst. MfG Marius
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!
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.
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?
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.
Ixh habe #define SHIFT ((unsigned long)(log(32)/log(2))) gerade ausprobiert, bringt aber die gleiche Meldung
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.