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!
abc123 schrieb: >> PS.: LEDXon und LEDXoff habe ich deklariert. > > Wie? #define LED1on PORTD &= ~_BV(PD0) /*links vorne ; PORTB &= ~_BV(PB1) /*1. Ebene*/ #define LED1off PORTD |=_BV(PD0) /*links vorne ; PORTB |=_BV(PB1) /*1. Ebene*/ ... usw das sollte passen, er meckert an den Klammern rum...
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: > Darüber wird noch zu reden sein. > So wie du dir das vorstellst gehts auf jeden Fall nicht. http://www.boost.org/doc/libs/1_48_0/libs/preprocessor/doc/ref/repeat.html
Arc Net schrieb: > http://www.boost.org/doc/libs/1_48_0/libs/preproce... Sehr hilfreich für jemanden, der noch nicht einmal ein for-Schleife unfallfrei hinbekommt. mfg.
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 | void LEDon(int x) |
2 | {
|
3 | switch(x) |
4 | {
|
5 | case 1 : LED1on; break; |
6 | case 2 : LED2on; break; |
7 | case 3 : LED3on; break; |
8 | case 4 : LED4on; break; |
9 | case 5 : LED5on; break; |
10 | case 6 : LED6on; break; |
11 | .
|
12 | .
|
13 | .
|
14 | case 27 : LED27on; break; |
15 | default : break; |
16 | }
|
17 | }
|
18 | |
19 | void LEDoff(int x) |
20 | {
|
21 | switch(x) |
22 | {
|
23 | case 1 : LED1off; break; |
24 | case 2 : LED2off; break; |
25 | case 3 : LED3off; break; |
26 | case 4 : LED4off; break; |
27 | case 5 : LED5off; break; |
28 | case 6 : LED6off; break; |
29 | .
|
30 | .
|
31 | .
|
32 | case 27 : LED27off; break; |
33 | default : break; |
34 | }
|
35 | }
|
36 | |
37 | for (int t=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.
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.