www.mikrocontroller.net

Forum: GCC Precompiler PIN Abfrage

Autor: Norbert S. (norton)
Datum: 06.05.2008 10:24

Hallo, kann mir vieleicht jemand weiterhelfen, warum bei folgendem Code
der GCC einen Fehler ausgibt?
#define XYZ    10
#if PIND == XYZ
  #error "test"
#endif

Fehlermeldung:

../lib_dip_switch.c:30:5: error: operator '*' has no left operand
make: *** [lib_dip_switch.o] Error 1
Build failed with 1 errors and 0 warnings...

Gruß Norton
Autor: Karl heinz Buchegger (kbuchegg) (Moderator)
Datum: 06.05.2008 10:37

Norbert S. wrote:
> Hallo, kann mir vieleicht jemand weiterhelfen, warum bei folgendem Code
> der GCC einen Fehler ausgibt?
>
>
> #define XYZ    10
> #if PIND == XYZ
>   #error "test"
> #endif
> 
>
> Fehlermeldung:
>
> ../lib_dip_switch.c:30:5: error: operator '*' has no left operand

Was ist PIND?
PIND ist ein Makro, das seinerseits zu so was expandiert
#define PIND *(volatile unsigned char*)0x20

Damit steht da nach der Makroexpansion

#if *(volatile unsigned char*)0x20 == XYZ

Und da wird offenbar der eigentlich als Dereferenzierungsoperator
gedacht erste * nicht als Dereferenzierung benutzt sondern als
Multiplikation. Macht ja auch Sinn: Wie soll der Präprozessor
einen Pointer dereferenzieren? Der Präprozessor macht Textersetzungen
und kann zur Not auch noch einfache Arithmetik machen (wenn ich
mich nicht irre), das wars dann aber auch schon.
Autor: Oliver (Gast)
Datum: 06.05.2008 10:39

PIND ist über io.h in etwa so definiert
#define PIND  _SFR_IO8(0x10)
mit
#define _SFR_IO8(io_addr) ((io_addr) + __SFR_OFFSET)
Das kriegt der Preprozessor in einem #if nicht auseinandergefieselt. Der
kann nur einfaches
#define IRGENDWAS 10

#if IRGENDWAS == 10
 #error "xx"
#endif
Oliver

Antwort schreiben

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

Wichtige Regeln - erst lesen, dann posten!

  • Suchfunktion und Betreffsuche benutzen - vielleicht gibt es schon einen ähnlichen Beitrag
  • Aussagekräftigen Betreff wählen
  • Im Betreff angeben um welchen Controllertyp es geht (AVR, PIC, ...)
  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang
  • JPEG-Dateien (.jpg) nur für Fotos verwenden, Schaltpläne, Screenshots usw. als PNG oder GIF anhängen

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [pre]vorformatierter Text (z.B. Code in anderen Sprachen)[/pre]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel






webmaster@mikrocontroller.netImpressumWerbung auf Mikrocontroller.net