Forum: PC-Programmierung Variable in Anweisung


von kewiee (Gast)


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.

von STK500-Besitzer (Gast)


Lesenswert?

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!

von abc123 (Gast)


Lesenswert?

kewiee schrieb:
> PS.: LEDXon und LEDXoff habe ich deklariert.

Wie?

von kewiee (Gast)


Lesenswert?

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

von hint! (Gast)


Lesenswert?

kewiee schrieb:
> for (int t=1; t=27; t++)

hint!

von kewiee (Gast)


Lesenswert?

hint! schrieb:
> hint!

?

von Tom M. (tomm) Benutzerseite


Lesenswert?

kewiee schrieb:
> for (int t=1; t=27; t++)
1
               ^^^^

Hint #2
SCNR ;)

von Thomas E. (thomase)


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.

von kewiee (Gast)


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ß

von Karl H. (kbuchegg)


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?

von Arc N. (arc)


Lesenswert?

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

von Thomas E. (thomase)


Lesenswert?

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.

von Wegstaben V. (wegstabenverbuchsler)


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.

von usr (Gast)


Lesenswert?

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

von Rolf M. (rmagnus)


Lesenswert?

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.

von Peter S. (psavr)


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.

von Volkmar D. (volkmar)


Lesenswert?

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

von Clown (Gast)


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.

von Peter S. (psavr)


Lesenswert?

>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

von Karl H. (kbuchegg)


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.

von Peter S. (psavr)


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!

von Karl H. (kbuchegg)


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.

von Dennis H. (c-logic) Benutzerseite


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.

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
Noch kein Account? Hier anmelden.