Forum: Compiler & IDEs sonderbares define Problem mit AVR Studio 5


von Clemens K. (clemensk)


Lesenswert?

Hallo,

ich habe ein kleines Problem:
ich habe eine define.h
da steht folgendes drin:
#define VER_1 ((PINA & 0x02) != 0)
#define VER_2 ((PINA & 0x01) != 0)
#define HOR_1 ((PINA & 0x08) != 0)
#define HOR_2 ((PINA & 0x04) != 0)


dann eine c Datei:
da verwende ich das folgendermaßen:
case 1:
if
((HOR_1 & (Richtung == DOWN)) | (HOR_2 & (Richtung == UP)) | (count_hor 
== Anzahl) ) {stop_hor = 1;
break;
};

Wobei es hier nur darum geht das HOR_1 und HOR_2 funktionieren, setze 
ich da VER_1 oder VER_2 ein, kommt folgende Meldung:
Error  1  'VER_1' undeclared (first use in this function) 
C:\Users\....\Motor.c  32  2  SolarTracker


Ich weiß, es heisst das es in der Funktion nicht deklariert ist, jedoch 
geht es mit den anderen, vorher definierten sachen..

ich bin wirklich ratlos?

von Klaus W. (mfgkw)


Lesenswert?

1. Warum zeigst du den Code, der funktioniert, und nicht den der nicht 
funktioniert?

2. Formatiere bitte vernünftig, und verwende [c]...
So einen unformatierten Haufen will das doch keiner lesen (ich zumindest 
nicht).

3. Wieso verknüpfst du logische Ausdrücke (((PINA & 0x08) != 0) etc.) 
mit binären Operatoren (& und |)? Bist du sicher, daß du das willst?

4. Die Zeilennummer der Fehlermeldung hilft nur, wenn man weiß, welche 
Zeile in deinem Quelltext diejenige ist, welche.

5. Man kann nur helfen, wenn du den Quelltext soweit reduzierst wie 
möglich, sodaß der Fehler noch auftritt, und den dann vollständig 
zeigst.
Nur ein kleines Fragment zeigen wird hier nicht helfen.
Bspw. sehe ich in deiner C-Daei kein #include "define.h"

clemens kruse schrieb:
> ich bin wirklich ratlos?

ich auch

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

clemens kruse schrieb:
> case 1:
> if
> ((HOR_1 & (Richtung == DOWN)) | (HOR_2 & (Richtung == UP)) | (count_hor
> == Anzahl) ) {stop_hor = 1;
> break;
> };


Mach aus den & jeweils && und aus den | jeweils ||.

Gruß,

Frank

von Pako (Gast)


Lesenswert?

clemens kruse schrieb:
> ich habe eine define.h
(...)
> dann eine c Datei:

Und inkludierst Du auch das define.h?

von Clemens K. (clemensk)


Lesenswert?

also, entschuldig meine miese aufbereitung, hier nochmal richtig:

define.h:
1
#define VER_1 ((PINA & 0x02) != 0)
2
#define VER_2 ((PINA & 0x01) != 0)
3
#define HOR_1 ((PINA & 0x08) != 0)
4
#define HOR_2 ((PINA & 0x04) != 0)


meine test.c:
1
#include "define.h"
2
#include <avr/io.h>
3
#include "delay.h"
4
5
void test(){
6
HOR_1;
7
VER_1;   
8
};

die Fehlermeldung:

Error  2  'VER_1' undeclared (first use in this function) 
C:\Users\...test.c  15  1  SolarTracker
Warning  3  each undeclared identifier is reported only once for each 
function it appears in  C:\Users\...test.c  15  1  SolarTracker


Zu & und ||, das ist um alles Bitweise zu machen? funktioniert es dann 
auch korrekt? ich habe es ehrlich gesagt so aus dem Turorial gezogen.

von Klaus W. (mfgkw)


Lesenswert?

clemens kruse schrieb:
> C:\Users\...test.c  15  1  SolarTracker

Soll 15 die Zeilennummer sein?
Soviele Zeilen hat die Datei doch gar nicht.

clemens kruse schrieb:
> };

das ; ist sicher falsch, aber hier wohl nicht das Problem.

clemens kruse schrieb:
> Zu & und ||, das ist um alles Bitweise zu machen? funktioniert es dann
> auch korrekt? ich habe es ehrlich gesagt so aus dem Turorial gezogen.

Es kommt drauf, an was du vorhast. Ich vermute: nein.

Nimm ein vernünftiges C-Buch, anstatt nach Gerüchten zu programmieren.
Und nein: man muß nicht jedem einzeln vorbeten, welche Operatoren es in 
C gibt und was sie machen. Das ist kein Fall für hier.

von Klaus W. (mfgkw)


Lesenswert?

PS: im Zweifelsfall würde ich erst die System-Headerdateien einbinden, 
dann die eigenen. PIN.. etc. werden ja in den eigenen schon verwendet, 
außerdem möchte man mit eigenen #defines ja nichts ändern, was in den 
systemweiten Headern definiert wird.

von hans (Gast)


Lesenswert?

Lösche doch bitte mal das Semikolon hinter dem Funktionsrumpf der 
test-Funktion. Um im ersten Beispiel hinter der If-Bedingung.

von Klaus W. (mfgkw)


Lesenswert?

clemens kruse schrieb:
> HOR_1;
> VER_1;

Was soll das bewirken?
Die beiden Makros werden durch Quelltext ersetzt, der nichts tut.

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


Lesenswert?

Klaus Wachtler schrieb:
> Die beiden Makros werden durch Quelltext ersetzt, der nichts tut.

Stimmt nicht ganz: das Register PINA wird zweimal eingelesen. ;-)

Naja, zumindest sollte es sich compilieren lassen.  Wenn ich
allerdings das oben gezeigte Schnipselchen nehme, eine leere
delay.h dazu anlege, und dann alles mit
1
avr-gcc -Os -mmcu=atmega1281 -c test.c

compiliere, dann funktioniert alles.  (Welchen Controller Clemens
wirklich benutzt, hat er uns lieber verschwiegen.)

D. h., das, was Clemens uns hier häppchenweise hinwirft, stimmt nicht
mit dem überein, was er wirklich benutzt.  (Einzige andere Möglichkeit:
seine "delay.h" enthält ein
1
#undef VER_1

was natürlich recht abstrus wäre. :)

von Clemens K. (clemensk)


Lesenswert?

Klaus Wachtler schrieb:
>> HOR_1;
>
>> VER_1;
>
>
>
> Was soll das bewirken?
>
> Die beiden Makros werden durch Quelltext ersetzt, der nichts tut.

Das ist schon klar. Das habe ich auch nur gemacht um den Fehler zu 
reproduzieren.

Klaus Wachtler schrieb:
> clemens kruse schrieb:
>
>> };
>
>
>
> das ; ist sicher falsch, aber hier wohl nicht das Problem.


ist korrigiert - ich werde da manchmal etwas schluderig.

Klaus Wachtler schrieb:
> Nimm ein vernünftiges C-Buch, anstatt nach Gerüchten zu programmieren.
>
> Und nein: man muß nicht jedem einzeln vorbeten, welche Operatoren es in
>
> C gibt und was sie machen. Das ist kein Fall für hier.


ich arbeite daran. trotzdem vielen dank!

von Karl H. (kbuchegg)


Lesenswert?

clemens kruse schrieb:
> Klaus Wachtler schrieb:
>>> HOR_1;
>>
>>> VER_1;
>>
>>
>>
>> Was soll das bewirken?
>>
>> Die beiden Makros werden durch Quelltext ersetzt, der nichts tut.
>
> Das ist schon klar. Das habe ich auch nur gemacht um den Fehler zu
> reproduzieren.

Das Problem ist, dass hier keiner deinen Fehler reproduzieren kann.
Du siehst keinen Fehler
Wir sehen keinen Fehler
Also liegt das eigentliche Problem wohl in den Teilen, die du nicht 
gezeigt hast.

Die Teile, die du gezeigt hast, in ein compilierbares Programm zu 
verpacken bringt nichts. Denn die werden compilieren, das brauchen wir 
gar nicht erst ausprobieren.

Wenn du weiter Hilfe brauchst, dann wird dir nichts anderes übrig 
bleiben als dein Original herzunehmen und abzuspecken. Alles was nicht 
unbedingt gebraucht wird, fliegt raus. Und das geht so lange, bis das 
Problem verschwindet. Die letzte problematische Version zeigst du dann 
und dann kann man sich gezielt auf die Suche machen.

von Pako (Gast)


Lesenswert?

Hast Du vielleicht im define.h so ein Konstrukt wie
1
#ifndef _DEFINE_H_
2
#define _DEFINE_H_
3
4
#define VER_1 ((PINA & 0x02) != 0)
5
...
6
7
#endif
drinn, das nicht funktioniert? Vielleicht Copy-Paste?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

clemens kruse schrieb:
> #include "define.h"
> #include <avr/io.h>
> #include "delay.h"

Diese Reihenfolge ist das Problem. "define.h" greift auf Definitionen 
zurück, die in <avr/io.h> gemacht werden, wird aber vorher eingebunden.

Ändere das so, daß Du als erstes  <avr/io.h> einbindest, und erst 
danach Deine "define.h".

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


Lesenswert?

Rufus Τ. Firefly schrieb:
> Diese Reihenfolge ist das Problem. "define.h" greift auf Definitionen
> zurück, die in <avr/io.h> gemacht werden, wird aber vorher eingebunden.

Nein, das ist nicht tragisch.  Die Makros werden erst beim Aufruf
expandiert, erst zu diesem Zeitpunkt müssen alle Definitionen
vorliegen.

Ich schrieb ja oben schon, dass ich seine Codeschnipselchen
erfolgreich compilieren konnte (nachdem ich mir ein leeres delay.h
dazu erzeugt habe).

von Clemens K. (clemensk)


Lesenswert?

hat sich gelöst. Ich hatte in meinem jugendlichen Leichtsinn eine andere 
define.h im Projekt eingebunden als ich in dem Code inkludiert hatte. So 
wurden meine Änderungen einfach nicht compiliert. Jetzt geht alles! 
Vielen Dank nochmal!

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.