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
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
voidtest(){
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.
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
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.
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!