Hi,
ich will gerne in eine for Schleife die eine Anweisung ausführt eine
Variable einbinden. Also ich habe 27 LEDs, die for Schleife soll
hochzählen und da wo nun (t) steht soll die Variable eingesetzt werden.
Allerdings meckert mein Programm beim übersetzten. Wie kann ich das den
bewerkstelligen? Ist das in einer for Schleife überhaupt machbar?
Arbeite mit AVR Studio 5 in C++.
for (int t=1; t=27; t++)
{
LED(t)on; _delay_ms(time); LED(t)off; _delay_ms(time);
}
PS.: LEDXon und LEDXoff habe ich deklariert.
kewiee schrieb:> Ist das in einer for Schleife überhaupt machbar?
Ja, aber nicht so, wie du das machen willst.
kewiee schrieb:> PS.: LEDXon und LEDXoff habe ich deklariert.
Das dürfte immer noch das gleiche Makro sein wie letzte Woche...
Zeig mehr Programmcode!
kewiee schrieb:> LEDXon und LEDXoff habe ich deklariert
Definiert nicht deklariert. Mal ganz am Rande.
Und das?
kewiee schrieb:> LED(t)on
Wo ist das definiert?
Das: "LED(t)on" ist doch nicht gleich dem: "LEDXon".
Der Compiler kann zwar eine ganze Menge, aber raten, was du gemeint
haben könntest, das tut er nicht.
kewiee schrieb:> for (int t=1; t=27; t++)
Da wurde schon weiter oben drauf hingewiesen.
Ich schreib' mal irgendwas hin und hoffe, daß es funktioniert. Wenn
nicht, frage im Forum, was ich falsch gemacht habe.
Kann ich dir genau sagen: Alles.
Vor allen Dingen hast du nie ein C-Buch in der Hand gehabt, geschweige
denn drin gelesen.
So läuft das nicht mit der Programmierung. Und vergiss' diese
Scheiß-Makros und guck' dir Funktionen an.
Und sowas hier:
>for (int t=1; t=27; t++)>{>LED(t)on; _delay_ms(time); LED(t)off; _delay_ms(time);>}
So sieht das aus:
for (int t=1; t=27; t++)
{
LED(t)on;
_delay_ms(time);
LED(t)off;
_delay_ms(time);
}
Und nicht anders.
mfg.
Thomas Eckmann schrieb:>> LEDXon und LEDXoff habe ich deklariert> Definiert nicht deklariert. Mal ganz am Rande.
ok
Thomas Eckmann schrieb:> Wo ist das definiert?> Das: "LED(t)on" ist doch nicht gleich dem: "LEDXon".
mit dem X wollte ich nur sagen das ich die LED1on, LED2on, ... definiert
habe.
Mein eigentliches Problem war ja die Variable t in die Forschleife für
die jeweilige LED eizubauen mit einer "hint" was auch immer das ist :-)
Gruß
kewiee schrieb:>> Wo ist das definiert?>> Das: "LED(t)on" ist doch nicht gleich dem: "LEDXon".>> mit dem X wollte ich nur sagen das ich die LED1on, LED2on, ... definiert> habe.
Darüber wird noch zu reden sein.
So wie du dir das vorstellst gehts auf jeden Fall nicht.
Und wenn dir nicht klar ist warum, dann solltest du, da hat Thomas schon
recht, auf die besch.... makros verzichten. Oder alternativ ein C-Buch
lesen und dich mal mit der Arbeitsweise des Präprozessors vertraut
machen. Aber so wie ich das sehe, kommen da noch 20 andere Dinge vorher.
> die jeweilige LED eizubauen mit einer "hint" was auch immer das ist :-)
Hint ist engl. für Hinweis.
Und gemeint ist, dass du an dieser Stelle einen großen Bock geschossen
hast.
PS: Was hat das ganze eigentlich im PC Forum verloren?
Karl Heinz Buchegger schrieb:> Hint ist engl. für Hinweis.> Und gemeint ist, dass du an dieser Stelle einen großen Bock geschossen> hast.
@kewiee
hint zum hint:
schau mal in deinem C-Buch nach, ob es Unterschiede gibt zwischen "="
und "==". Und dann überlege mal ob die gewonnene Erkenntnis in der
for-Schleife irgendwie verwertet werden kann
> Allerdings meckert mein Programm beim übersetzten.
noch ein hint:
wenn der Compiler (nicht dein Programm) beim übersetzten meckert, dann
macht er das ja nicht willkürlich, sondern weil er auf eine Situation
hinweisen möchte. Les das was der Compiler auswirft, übersetze es und
versuche zu verstehen was er wohl meinen könnte.
Tom M. schrieb:>> for (int t=1; t=27; t++)
--> das t=27 ist eine zuweisung und die is immer logisch 1 also hast du
hier eine endlosschleife.
Nur mal so am Rande ich finds scheiße das hier soviele jeden immer
gleich runtermachen -.-
usr schrieb:> Nur mal so am Rande ich finds scheiße das hier soviele jeden immer> gleich runtermachen -.-
Ich sehe niemanden, der ihn hier runtermacht. Vielmehr will man ihn hier
dazu zu bringen, selbst auf die Lösung zu kommen. Das hilft mehr, als
sie einfach fertig vorgekaut hinzuwerfen.
Sowas wie "LED(t)on" geht in C nicht, aber ich empfehle Dir eine
Funktion daraus zu machen, wobei der (bzw die) Parameter in der Klammer
nach dem Funktionsnamen stehen muss!
1
voidLEDon(intx)
2
{
3
switch(x)
4
{
5
case1:LED1on;break;
6
case2:LED2on;break;
7
case3:LED3on;break;
8
case4:LED4on;break;
9
case5:LED5on;break;
10
case6:LED6on;break;
11
.
12
.
13
.
14
case27:LED27on;break;
15
default:break;
16
}
17
}
18
19
voidLEDoff(intx)
20
{
21
switch(x)
22
{
23
case1:LED1off;break;
24
case2:LED2off;break;
25
case3:LED3off;break;
26
case4:LED4off;break;
27
case5:LED5off;break;
28
case6:LED6off;break;
29
.
30
.
31
.
32
case27:LED27off;break;
33
default:break;
34
}
35
}
36
37
for(intt=1;t==27;t++)
38
{
39
LEDon(t);
40
delay_ms(time);
41
LEDoff(t);
42
delay_ms(time);
43
}
Anstelle der langen switch-case Kette gäbe es sicher noch raffiniertere
Lösungen, z.B. mit dem Index x direkt auf einen Array of Functions
zuzugreifen, bringt aber letztendlich wohl auch nicht viel.
Das hier wird aber nicht funktionieren:
Peter S. schrieb:> for (int t=1; t==27; t++)
Nochmal nachschlagen, was die Bedingung in einer for-Schleife
bedeutet...
Peter S. schrieb:> case 27 : LED27off; break;> default : break;> }> }>> for (int t=1; t==27; t++)
Wirklich???!? Den Schleifenkopf würde ich noch einmal gründlich
überprüfen!
> {> LEDon(t);
<...>
>> Anstelle der langen switch-case Kette gäbe es sicher noch raffiniertere> Lösungen, z.B. mit dem Index x direkt auf einen Array of Functions> zuzugreifen, bringt aber letztendlich wohl auch nicht viel.
Tabelle mit Tupeln von Port- und Bit-Index könnte ein Ansatz sein. Aber
in diesem Stadium der Programmierkünste wohl noch etwas verfrüht.
Aus pädagogischer Sicht sind die switch-case Konstruktionen in diesem
Fall vielleicht gar nicht so schlecht. Das Einstellen des Lernerfolgs
kann dann daran abgelesen werden, daß Schüler/Studenten die leidige
Tipparbeit durch das Gelernte vermeiden.
Auf jeden Fall würde ich vorerst auf die Verwendung von Makros
verzichten. Wer bitte soll denn das Zusammenspiel von Präprozessor und
Compiler verstehen, solange die grundlegenden Elemente noch nicht
verstanden sind? Datentypen, Konstrollkonstrukte und Funktionen -
Schritt für Schritt.
>Das hier wird aber nicht funktionieren:>>Peter S. schrieb:>> for (int t=1; t==27; t++)
Alles klar, war da schneller mit tippen als mit denken... ;o)
t!=27 oder t<=27 meinte ich eigentlich
Peter S. schrieb:>>Das hier wird aber nicht funktionieren:>>>>Peter S. schrieb:>>> for (int t=1; t==27; t++)>> Alles klar, war da schneller mit tippen als mit denken... ;o)>> t!=27 oder t<=27 meinte ich eigentlich
Gratuliere.
Jetzt kannst du ihm auch gleich noch erklären, WARUM das so sein muss.
Sonst hat er in seiner kurzen Liste von Lernunterlagen noch einen
Eintrag mehr, von einem Codestück das er nicht versteht und von dem er
nicht weiß warum es so sein muss.
Rolf hat es oben schon angesprochen:
Es gibt Dinge, auf die muss er selber darauf kommen bzw nachlesen und
verinnerlichen. Der Aufbau eine for-Schleife und was die einzelnen Teile
darstellen, welche Bedeutung sie haben und welche Folgerungen man daraus
ziehen muss, das ist von diesem Kaliber.
Er darf da 5 mal reinfallen. Das ist ok. Aber nach dem ersten mal
reinfallen, muss er sich daran erinnern, was hier das Problem war und in
der Lage sein, das selbsttätig in den Griff zu kriegen, wenn man ihn mit
der Nase drauf stösst. Nach dem 5-mal reinfallen muss dann ein kurzes
"deine for-Schleifen ist falsch" reichen, damit er sie nach den
typischen Fehlern absucht.
Diesen Punkt hat keiner für ihn gelöst, weil wir ihn dazu bringen wollen
in seinen Unterlagen den Aufbau einer for-Schleife noch einmal
nachzulesen. Ganz speziell was es mit dem mittleren Ausdruck auf sich
hat: Was ist seine Aussage? Wie wird er benutzt um den Ablauf der
Schleife zu steuern?
Das sind Dinge, die muss er für sich selbst verinnerlichen.
@Karl Heinz Buchegger (kbuchegg)
>Gratuliere.>Jetzt kannst du ihm auch gleich noch erklären, WARUM das so sein muss.>Sonst hat er in seiner kurzen Liste von Lernunterlagen noch einen>Eintrag mehr, von einem Codestück das er nicht versteht und von dem er>nicht weiß warum es so sein muss...
Der "kewiee" kommt nicht weiter und fragt nach einer Lösung, er kriegt
eine Lösung, was soll's! Es gibt hier in diesem Forum mehr als schon
genug Möchtegern-Lehrmeister, Polizisten, Angeber und Besserwisser, ist
nicht meine Sache andere auszubilden!
Peter S. schrieb:> eine Lösung, was soll's! Es gibt hier in diesem Forum mehr als schon> genug Möchtegern-Lehrmeister,
Es gibt hier in diesem Forum vor allen Dinge viel zu viele Anfänger, die
meinen sie könnten ohne ein C-Buch eine Sprache wie C erlernen oder
sinnvolle größere Programme ohne Grundlagenwissen schreiben.
Das funktioniert nun mal nicht. Ohne Unterlagen wird das nichts. Oder
sprichst du ihn bei jedem kleinsten Grundlagen Problem erneut durch, das
er eigentlich mit 10 Minuten Lesen in seinem Buch soweit geklärt haben
könnte, dass er eine sinnvolle Detailfrage stellen kann?
Es gibt nun mal einen Level, unter dem es nicht sinnvoll ist, dem
Lernenden das Werkzeug aus der Hand zu nehmen und es selbst zu machen!
Wer nicht mit einer Laubsäge umgehen kann, muss üben. Du hilfst ihm
nicht dabei, indem du seine Laubsägearbeit für ihn ausschneidest.
> Es gibt hier in diesem Forum vor allen Dinge viel zu viele Anfänger, die> meinen sie könnten ohne ein C-Buch eine Sprache wie C erlernen oder> sinnvolle größere Programme ohne Grundlagenwissen schreiben.
Nicht nur hier im Forum. Ich beobachte das in letzter Zeit auch öfters
an real existentiellen Menschen.
Keinen Antrieb durch Bücher oder gar autoditaktisch zu Lernen.
Es macht sich wohl irgendwie das Gerücht breit, daß einem zuviel Wissen
das Hirn sprengt.