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?
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
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
clemens kruse schrieb: > ich habe eine define.h (...) > dann eine c Datei: Und inkludierst Du auch das define.h?
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.
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.
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.
Lösche doch bitte mal das Semikolon hinter dem Funktionsrumpf der test-Funktion. Um im ersten Beispiel hinter der If-Bedingung.
clemens kruse schrieb: > HOR_1; > VER_1; Was soll das bewirken? Die beiden Makros werden durch Quelltext ersetzt, der nichts tut.
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. :)
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!
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.
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?
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".
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).
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.