Halli Hallo
Habe ein Problem mit meinem Code. Finde den Fehler nicht. Meiner Meinung
nach stimmt der Code so wie er ist, aber der compiler ist anderer
Meinung. Bin noch nicht sehr erfahren mit C und Micro's. wäre für jede
Hilfe dankbar.
übrigends ich verwende das myAVR Workpad. Einen Atmega8515
legt ein Array von 31 Integer-Variablen an, und zwar
licht[0]...licht[30].
licht[31] gibt es nicht! Immer dran denken: Bei der Deklaration wird die
Anzahl der Array-Elemente angegeben. Die Zählung beginnt aber mit
dem Index 0.
Auweia! Da ist aber einiges im Argen. Bitte schau Dir mal ein C-Tutorial
an. Ein Array kann nicht zur Laufzeit mit variabler Länge deklariert
werden! Das da geht gar nicht:
1
intwerte[zahlenrange];
2
intnr[zahlenrange];
Abgesehen davon ist es bei solchen Anfragen unsinnig, zu erzählen, dass
der Compiler Fehlermeldungen ausgibt, ohne den Wortlaut der
Fehlermeldungen ebenfalls anzugeben. Oder willst Du uns hier mit
heiteren Ratespielchen beglücken?
Sorry hab die Fehlermeldung vergessen.
Hier:
test.cc:35 35: error: expected unqualified-id before "volatile"
35: error: expected `)' before "volatile"
35: error: expected `)' before "volatile"
test.cc:36 36: error: expected unqualified-id before "volatile"
36: error: expected `)' before "volatile"
36: error: expected `)' before "volatile"
test.cc:37 37: error: expected unqualified-id before "volatile"
37: error: expected `)' before "volatile"
37: error: expected `)' before "volatile"
test.cc:38 38: error: expected unqualified-id before "volatile"
38: error: expected `)' before "volatile"
38: error: expected `)' before "volatile"
test.cc:39 39: error: expected unqualified-id before "volatile"
39: error: expected `)' before "volatile"
39: error: expected `)' before "volatile"
test.cc:40 40: error: expected constructor, destructor, or type
conversion before '=' token
test.cc:41 41: error: expected constructor, destructor, or type
conversion before '=' token
test.cc:42 42: error: expected constructor, destructor, or type
conversion before '=' token
test.cc:43 43: error: expected constructor, destructor, or type
conversion before '=' token
test.cc:44 44: error: expected constructor, destructor, or type
conversion before '=' token
test.cc:45 45: error: expected constructor, destructor, or type
conversion before '=' token
test.cc:46 46: error: expected constructor, destructor, or type
conversion before '=' token
test.cc:47 47: error: expected constructor, destructor, or type
conversion before '=' token
test.cc:48 48: error: expected constructor, destructor, or type
conversion before '=' token
test.cc:49 49: error: expected constructor, destructor, or type
conversion before '=' token
test.cc:50 50: error: expected constructor, destructor, or type
conversion before '=' token
test.cc:51 51: error: expected constructor, destructor, or type
conversion before '=' token
test.cc:52 52: error: expected constructor, destructor, or type
conversion before '=' token
test.cc:53 53: error: expected constructor, destructor, or type
conversion before '=' token
test.cc:54 54: error: expected constructor, destructor, or type
conversion before '=' token
test.cc:55 55: error: expected constructor, destructor, or type
conversion before '=' token
test.cc:56 56: error: expected constructor, destructor, or type
conversion before '=' token
test.cc:57 57: error: expected constructor, destructor, or type
conversion before '=' token
test.cc:58 58: error: expected constructor, destructor, or type
conversion before '=' token
test.cc:59 59: error: expected constructor, destructor, or type
conversion before '=' token
test.cc:60 60: error: expected constructor, destructor, or type
conversion before '=' token
test.cc:61 61: error: expected constructor, destructor, or type
conversion before '=' token
test.cc:62 62: error: expected constructor, destructor, or type
conversion before '=' token
test.cc:63 63: error: expected constructor, destructor, or type
conversion before '=' token
test.cc:64 64: error: expected constructor, destructor, or type
conversion before '=' token
test.cc:65 65: error: expected constructor, destructor, or type
conversion before '=' token
test.cc:66 66: error: expected constructor, destructor, or type
conversion before '=' token
test.cc:67 67: error: expected constructor, destructor, or type
conversion before '=' token
test.cc:68 68: error: expected constructor, destructor, or type
conversion before '=' token
test.cc:69 69: error: expected constructor, destructor, or type
conversion before '=' token
test.cc:70 70: error: expected constructor, destructor, or type
conversion before '=' token
test.cc:71 71: error: expected constructor, destructor, or type
conversion before '=' token
=' token
test.cc:61 61: error: expected constructor, destructor, or type
conversion before '=' token
test.cc:62 62: error: expected constructor, destructor, or type
conversion before '=' token
test.cc:63 63: error: expected constructor, destructor, or type
conversion before '=' token
test.cc:64 64: error: e
Und das geht auch schief. Schau Dir die Dokumentation der
Bibliotheksfunktionen an! Da steht, dass die _delay_XX-Funktionen
erstens in ihrer maximalen Verzögerungszeit begrenzt sind (ion
Abhängigkeit vom CPU-Takt) und außerdem, dass sie nur dann korrekt
funktionieren, wenn die übergebenen Werte zur Compilezeit bekannt
(konstant) sind und wenn die Optimierung des Compilers eingeschaltet
ist!
Nun, C ist nicht BASIC. Ausführbarer Code kann in C nur innerhalb
einer Funktion erscheinen, nicht ,,einfach so'' auf globaler Ebene.
Wenn du vor all deine Initialisierungen ein
1
staticvoidinit(void){
und dahinter eine
1
}
schreibst und als erstes in main()
1
init();
aufrufst, dann compiliert das Ganze anstandslos.
Du hast die Benutzungshinweise zu _delay_ms() aber nicht beachtet,
das wird so nicht sinnvoll funktionieren (sondern viel zu langsam
werden): diese Funktion kann nur mit einer zur Compilezeit bekannten
Anzahl von Millisekunden sinnvoll arbeiten. Besser noch, nimm einen
Timer für die Verzögerung.
Die Erzeugung eines random seed durch Auslesen eines Zählers allein
bringt dir keinen Zufall, sondern mit hoher Wahrscheinlichkeit stets
wieder dasselbe. Der Controller ist halt eine Maschine, und wenn er
sonst durch nichts beeinflusst wird, arbeitet er die gleiche
Befehlssequenz halt auch immer in der gleichen Zeit ab. Du brauchst
folglich für echten Zufall noch irgendein anderes physikalisches
Ereignis, das nicht vorhersagbar ist. Das kann eine Bediener-
Interaktion sein, es kann aber auch von der Taktfrequenz eines zweiten
Timers abgeleitet sein, der nicht starr mit dem Hauptoszillator
gekoppelt ist. Wenn du den ATmega8515 von einem Quarz betreibst (so
klingt dein F_CPU), dann könntest du dafür indirekt den
1-MHz-RC-Oszillator benutzen. Dieser wird für das Timing der
EEPROM-Schreibfunktion herangezogen. Wenn du also misst, wie viele
CPU-Takte (Quarz) das Schreiben einer EEPROM-Zelle benötigt, so wird
diese Zahl geringfügig variieren (Betriebsspannung, Temperatur), das
kannst du dann als random seed benutzen. Vorsicht aber, eine
EEPROM-Zelle hat nur eine begrenzte Lebensdauer, wenn du das zu häufig
machst, machst du sie damit kaputt (was aber natürlich für den
gewünschten Zweck egal wäre).
Christian Rutschmann wrote:
> Sorry hab die Fehlermeldung vergessen.
Neee, jetzt korrigier erst mal die o.g. Sachen. Dann compilierst Du das
neu und schickst dann nochmal das was übrig bleibt.
> Und sowas geht in C gar nicht!
Der Compiler beklagt sich nicht darüber, also geht es. ;-) Es wird
aber sehr wahrscheinlich nicht das tun, was der Dichter uns damit
sagen wollte... Es wird zuerst 7 mit y verglichen. Das Ergebnis ist
entweder 0 oder 1, das wird dann auf <= 15 verglichen. Das Ergebnis
ist dann immer wahr.
Wenn man die Warnungen einschaltet, sagt der Compiler das auch:
1
foo.c: In function 'zufall':
2
foo.c:104: warning: no return statement in function returning non-void
3
foo.c: In function 'main':
4
foo.c:138: warning: comparisons like X<=Y<=Z do not have their mathematical meaning
5
foo.c:142: warning: comparisons like X<=Y<=Z do not have their mathematical meaning
6
foo.c:146: warning: comparisons like X<=Y<=Z do not have their mathematical meaning
>> Und sowas geht in C gar nicht!>> Der Compiler beklagt sich nicht darüber, also geht es. ;-) Es wird> aber sehr wahrscheinlich nicht das tun, was der Dichter uns damit> sagen wollte...
Das meinte ich eigentlich damit. Ich bin eben kein Compiler und sehe
auch Fehler, die nicht syntaktischer Natur sind;-) Aber wie ein Gedicht
sieht das ganze eigentlich nicht aus...
Christian Rutschmann wrote:
> Hab nun die Dinge korrigiert.> Bekomme nun einige Meldungen. Habe das Gefühl das diese Sache mit>
1
staticvoidinit(void)
> nicht funktioniert.
Jörg hat ja auch geschrieben, Du sollst die Initialisierungen (also
die Zuweisungen) mit static void init(void) Klammern und nicht die
Variablendklarationen! So wie Du es jetzt da stehen hast, sind all die
Variablen funktionslokal in init() und dementsprechend in den anderen
Funktionen unbekannt. Die Deklarationen müssen natürlich global bleiben!
Christian Rutschmann wrote:
> Habe mit deiner Beschreibung einwenig mühe. Wie sollte das dann> aussehen?
Meinst Du meinen Beitrag?
Also, Langversion:
Jede Variable hat einen Gültigkeitsbereich (Scope). Außerhalb des
Gültigkeitsbereiches ist die Variable unbekannt und kann demzufolge dort
nicht verwendet werden. Wenn eine Variable innerhalb einer Funktion
deklariert wird, dann ist sie auch nur innerhalb der Funktion gültig.
Wenn eine Variable mehreren Funktionen zur Verfügung stehen soll, dann
muss sie global deklariert werden, also außerhalb jeglicher Funktion
(und Deklarationen sind praktisch das einzige, was in C außerhalb von
Funktionen erlaubt ist!). Du hattest ZUweisungen an Variablen
außerhalb einer Funktion stehen, und das ist in C nicht zulässig! Das
war das, worauf Jörg Dich hingewiesen hat. Mit Deiner "Lösung" hast Du
allerdings nicht nur die Zuweisungen, sondern auch die
Variablendeklarationen in die Funktion init() verfrachtet, mit dem
Effekt, dass die Variablen jetzt nur noch innerhalb der Funktion init()
bekannt sind, und nicht mehr da, wo Du sie verwenden willst. Wenn Du
init() aufrufst, werden die Variablen deklariert und initialisiert, aber
mit der schließenden Klammer "}" am Ende von init() hören die Variablen
schon wieder auf, zu existieren.
okay jetzt funktionierts. danke für eure hilfe. weisst du einen kurs den
du empfehlen kannst? oder ein buch. wie gesagt bin anfänger auf
unterster stufe.