Variable in Anweisung

Gast #2520448
Lesenswert?

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.
#2520534
Lesenswert?

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.
Gast #2520569
Lesenswert?

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ß
#2520578
Lesenswert?

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?
#2521000
Lesenswert?

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.
#2521061
Lesenswert?

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.
Gast #2521089
Lesenswert?

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.
#2521267
Lesenswert?

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.
#2521401
Lesenswert?

@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!
#2521417
Lesenswert?

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.
Persönliche Seite #2523010
Lesenswert?

> 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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren