Forum: Compiler & IDEs Präprozessoranweisung das erste Mal


von Matthias H. (maethes26)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

könnt ihr mir bitte einen Tipp geben warum diese Anweisung siehe Bild so 
nicht funktioniert??

Ich definiere in der Headerdatei den keypad_port und möchte davon in 
Abhängigkeit des Taster definieren entweder Taster= PINA oder PINC

Meine Anweisung funktioniert noch nicht ganz.

Ich habe es nach den Unterlagen durchgeführt, die ich im Netz gefunden 
habe.

http://de.wikibooks.org/wiki/C-Programmierung:_Pr%C3%A4prozessor#.23if


Es wäre sehr nett, wenn ihr mir bei dieser Kleinigkeit helfen könntet.


Herzlichsten Dank und viele Grüße,

Matthias.

hier ist die Headerdatei:

#ifndef keypad_h
#define keypad_h

#define keypad_port PORTC

#if (PORTC=keypad_port)
#define Taster PINC

#if (PORTA=keypad_port)
#define Taster PINA

#endif


extern unsigned char flankenwechsel2;
extern unsigned char keypad_uebergeben;        //damit der Wert niht 
doppelt eingelesen werden kann



char keypad_wert_einlesen(unsigned char warten);
void keypad_ini(void);

#endif

von Klaus W. (mfgkw)


Lesenswert?

Das steht in deinem C-Buch aber nicht so drin, oder?

Zu jedem #if, #ifdef etc. gehört genau ein #endif.
Wenn man bei dir nachzählt, stimmt das nicht.

Was du vorhast, weiß ich nicht.
Aber ein Vergleich wird mit = auch nicht funktionieren, sollte auch in 
eine guten C-Buch stehen.

Quelltext als Bilder einzufügen, ist Unsinn.
Und lesbaren Quelltext bekommt man, indem man entsprechende Tags beim 
Schreiben benutzt.

Und "geht nicht" ist so ziemlich der schlechteste Versuch, vernünftige 
Hilfe zu bekommen.

von Krapao (Gast)


Lesenswert?

Warum so kompliziert?
1
#ifndef keypad_h
2
#define keypad_h
3
4
/*
5
 Hardwaredefinitionen
6
 (avr/io.h muss bereits includiert sein)
7
 */
8
#define keypad_port PORTC
9
#define Taster PINC
10
11
/*
12
 Globale Variablen
13
 */
14
extern unsigned char flankenwechsel2;
15
extern unsigned char keypad_uebergeben;
16
17
/*
18
 Funktionsprototypen
19
 */
20
char keypad_wert_einlesen(unsigned char warten);
21
void keypad_ini(void);
22
23
#endif /* keypad_h */

### Oder ###

1
#ifndef keypad_h
2
#define keypad_h
3
4
/*
5
 Hardwaredefinitionen
6
 (avr/io.h muss bereits includiert sein)
7
 */
8
#define keypad_port PORTC
9
10
#if (keypad_port == PORTC)
11
#define Taster PINC
12
#endif
13
14
#if (keypad_port == PORTA)
15
#define Taster PINA
16
#endif
17
18
#ifndef Taster
19
#error "Taster ist nicht definiert"
20
#endif
21
22
/*
23
 Globale Variablen
24
 */
25
extern unsigned char flankenwechsel2;
26
extern unsigned char keypad_uebergeben;
27
28
/*
29
 Funktionsprototypen
30
 */
31
char keypad_wert_einlesen(unsigned char warten);
32
void keypad_ini(void);
33
34
#endif /* keypad_h */

Wahrscheinlich hat du nur = und == verwechselt.

von Matthias H. (maethes26)


Lesenswert?

Hallo zusammen,

danke für Eure Hilfe. Doch leider hat das nicht viel gebracht, denn ich 
bin kein Stück weiter.

baue ich diese Aussage ein, gibt es immer 2 Fehlermeldungen operator has 
no left operand.

Irgendwas stimmt wohl an der Syntax dennoch nicht und ich weiß nicht 
wieso.

#if (PORTA==keypad_port)
#define Taster PINA
#endif

#if (PORTB==keypad_port)
#define Taster PINB
#endif


Mit dieser Aussage möchte ich eine bedingte Zuweisung von Taster zu PINA 
oder PINB.

Viele Grüße,

Matthias.

von Rolf Magnus (Gast)


Lesenswert?

PORTA ist ein Makro, das durch einen Ausdruck ersetzt wird, mit dem der 
Präprozessor selbst nichts anfangen kann, weil er z.B. Casts und 
Zeiger-Dereferenzierungen enthält.

von Matthias H. (maethes26)


Lesenswert?

Hallo,

danke für Deine Antwort.

Ich verstehe zwar noch nicht was Casts und
Zeiger-Dereferenzierungen sind, aber es scheint wohl nicht ohne weiteres 
möglich zu sein meine Idee umzusetzen.

Darum lasse ich es erst mal so.

Viele Grüße,

Matthias.

von Rolf Magnus (Gast)


Lesenswert?

Matthias H. schrieb:
> Ich verstehe zwar noch nicht was Casts und Zeiger-Dereferenzierungen sind,

Ok, dann soll für jetzt mal die Information ausreichen, daß es dem 
Präprozessor da genau wie dir geht. ;-)

von Matthias H. (maethes26)


Lesenswert?

ok, schön, dass Du das mit Humor nimmst.


ich bin immer noch dabei meine alten ilcudierten C.Dateien!!! 
umzuschreiben

1. jeweils eine dazugehörige Headerdatei erstellen
2. die C-Datein richtig ins projekt einbinden über Add existing item AVR 
Studio5

Da ist viel Arbeit, wenn man 7 Dateien mit vielen Variablen hat und man 
Datei für Datei nach und nach wieder einbindet


Viele Grüße,

Matthias.

von Micha S. (e-tec)


Lesenswert?

Dafür gibt es ein stichwort:

Modularisierung!

spart dir viel arbeit :-)

wie verarbeitest du das makro denn weiter?
diesen Fheler:
operator has
no left operand.  hast du ja bereits im bild oben, ich vermute du hast 
irgendwo anders im code noch einen kleinen fehler drin, aber lass dich 
davon nicht entmutigen, das passiert :)

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Matthias H. schrieb:
> Ich verstehe zwar noch nicht was Casts und
> Zeiger-Dereferenzierungen sind

Dann schreib' dir mal eine Minimal-Datei:
1
#include <avr/io.h>
2
3
PORTC

schick diese Datei durch den Präprozessor und sieh dir das Ergebnis
an:
1
avr-gcc -mmcu=atmega8 -E minimaldatei.c

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.