Forum: Mikrocontroller und Digitale Elektronik For schleife immer nächsten wert mitrechnen


von VIISA (Gast)


Lesenswert?

Hi,

ich komme gerade nicht weiter. Und zwar habe ich eine normale 
forschleife
1
for(i = 0; i < 144; i++) // <-- ist das der Schleifenkopf?

und möchte das nach dem Schleifenkopf schimpft sich das glaube ich immer 
der wert i+1 genommen wird und ich damit arbeite also angenommen i ist 
gerade bei 50 möchte ich 50 + 51 oder 89 + 90 haben also immer den 
darauffolgenden wert von i mit rechnen. ich hoffe das war verständlich 
und jemand kann mir helfen.

Mfg

von Zoidberg (Gast)


Lesenswert?

Verstehe ich dich richtig? Hast du ein Beispiel wo dir das Probleme 
macht?

Da kannst du doch einfach (i+1) in den Berechnungen nehmen.
Oder for(i = 1; i < 145; i++){}
Oder, oder, oder. Es werden garantiert noch einige kreativen Ideen 
kommen.

von N. M. (mani)


Lesenswert?

1
uint16_t blub =0;
2
3
for(uint8_t i = 0; i < 144; i++) 
4
{
5
  blub = i+(i+1); //z.B 50+51
6
  //Mach was mit blub
7
}

von A. S. (Gast)


Lesenswert?

Hausaufgaben immer im Original posten. Und dann erst, was Du verstanden 
und vor hast.

von VIISA (Gast)


Lesenswert?

Zoidberg schrieb:
> Verstehe ich dich richtig? Hast du ein Beispiel wo dir das
> Probleme
> macht?
>
> Da kannst du doch einfach (i+1) in den Berechnungen nehmen.
> Oder for(i = 1; i < 145; i++){}

ne ne so meinte ich das nicht. In einer For schleife hast du es ja so:



for(i = 1; i < 145; i++){

print (i)

}

i:

1
2
3
4
5
...

ich möchte es aber so

i:

1 & 2
2 & 3
40 & 41
102 & 103

ich wollte den wert von i den ich bekomme immer mit dem darauffolgenden 
wert haben also 2 Werte

Mfg

von Mr. Meeseeks look at me (Gast)


Lesenswert?

Meinst du sowas?


#define ARRAY_LENGTH 144

for(i = 0; i < (ARRAY_LENGTH-1) ; i++)
{
   sum = valArr[i] + valArr[i+1]
}

Du musst darauf achten, dass du dann darauf
achten, dass du "einen eher" aufhörst, als weil
innerhalb der Schleife das Argument "künstlich" ums
ein vergrößert ist.

Das funktioniert, weil weil das "i+1" nur eine lokale
Berechnung ist und im Gegensatz zu i++ nicht zu einem
Inkrement von i führt.

von devzero (Gast)


Lesenswert?

1
for (i = 0; i < 145; i++) {
2
    printf("%i & %i\n", i, i + 1);
3
}

von devzero (Gast)


Lesenswert?

ok bei 1 beginnen

von Falk B. (falk)


Lesenswert?

VIISA schrieb:
> Hi,
>
> ich komme gerade nicht weiter. Und zwar habe ich eine normale
> forschleife
>
> for(i = 0; i < 144; i++) // <-- ist das der Schleifenkopf?

Schon mal in ein C-Buch geschaut? Auch mal gelesen und drüber 
nachgedacht?
Nein, googeln ist KEIN Ersatz dafür!

> und möchte das nach dem Schleifenkopf schimpft sich das glaube ich immer
> der wert i+1 genommen wird und ich damit arbeite

Wer oder was hindert dich daran?
1
  for (i = 0; i < 144; i++) {
2
    a = b * (i+1);
3
  }

> darauffolgenden wert von i mit rechnen. ich hoffe das war verständlich
> und jemand kann mir helfen.

Du kannst dir nur selber helfen, indem du mal anfängst old school ein 
Thema zu erarbeiten. Ja, ein Buch aus gutem, alten Papier ist da immer 
noch SEHR nützlich.

Keine Ursache.

: Bearbeitet durch User
von Samuel C. (neoexacun)


Lesenswert?

Naja, i kann halt zu jedem Zeitpunkt nur einen Wert annehmen. Aber was 
hindert dich daran, im Schleifenrumpf mit i und (i+1) zu rechnen?

von Mr. Meeseeks look at me (Gast)


Lesenswert?

ja dann (hoffe, ich hab das mit der Formatierung richtig gemacht...)

#define ARRAY_LENGTH 144

for(i = 0; i < (ARRAY_LENGTH-1) ; i++)
{
   print(%i "& "%i\n,i, i+1);

}
http://www2.hs-esslingen.de/~zomotor/home.fhtw-berlin.de/junghans/cref/FUNCTIONS/format.html

von Samuel C. (neoexacun)


Lesenswert?

Ja, nur hast du dir jetzt die Sache mit dem ARRAY aufschwatzen lassen.

Du kannst den Kopf genau so schreiben, wie du es im Eingangspost gemacht 
hast.

von Walter K. (walter_k488)


Lesenswert?

VIISA schrieb:
> Hi,
>
> ich komme gerade nicht weiter. Und zwar habe ich eine normale
> forschleife
>
>
1
> 
2
> for(i = 0; i < 144; i++) // <-- ist das der Schleifenkopf?
3
> 
4
>
>
> und möchte das nach dem Schleifenkopf schimpft sich das glaube ich immer
> der wert i+1 genommen wird und ich damit arbeite also angenommen i ist...

Du kannst innerhalb der For-Schleife mit der Variable i machen was Du 
willst!

Wenn Du in der Schleife etwas mit i machst zb i = i + 1 ... dann ist das 
überhaupt kein Problem - wenn du dann aber willst, dass im nächsten Loop 
das „ alte “ i nur um 1 größer ist musst Du halt am Ende der Schleife i 
= i - 1 rechnen, damit i wieder den korrekten Wert bekommt.

Du kannst auch in der Schleife i = 1024; zuweisen - dann ist das halt in 
deinem Beispiel der letzte schleifendurchlauf

In C kannst Du fast alles machen

von Zoidberg (Gast)


Lesenswert?

Das wären aber komische Hausaufgaben....


gefällt es die so ggf. besser, als in Formeln o.ä. (i+1) zu benutzen?

for(i = 0; i < 144; i++)
{
  uint8_t i_inc = i+1;

  printf("%i & %i\n", i, i_inc );
}

von Walter K. (walter_k488)


Lesenswert?

Zoidberg schrieb:
> Das wären aber komische Hausaufgaben....
>
> gefällt es die so ggf. besser, als in Formeln o.ä. (i+1) zu benutzen?
>
> for(i = 0; i < 144; i++)
> {
>   uint8_t i_inc = i+1;
>
>   printf("%i & %i\n", i, i_inc );
> }

Wer hat Dir gelehrt, Variablen in der Schleife zu deklarieren?

von 123456 (Gast)


Lesenswert?

Walter K. schrieb:
> Wer hat Dir gelehrt, Variablen in der Schleife zu deklarieren?

Mecker nicht, der Compiler wird diesen Fall hervorragend richten.

von Walter K. (walter_k488)


Lesenswert?

123456 schrieb:
>> Walter K. schrieb:
>> Wer hat Dir gelehrt, Variablen in der Schleife zu deklarieren?
>
> Mecker nicht, der Compiler wird diesen Fall hervorragend richten.

Sicher - aber es ist sozusagen eine Stil-Frage!

Und da der Fragesteller offensichtlich gerade mit C anfängt - wundere 
ich mich schon über den ein oder anderen Beitrag hier!

von Samuel C. (neoexacun)


Lesenswert?

Walter K. schrieb:
> Sicher - aber es ist sozusagen eine Stil-Frage!

Und ist der "Stil" falsch? Oder einfach nur nicht dein Stil?

von Dieter R. (drei)


Lesenswert?

Samuel C. schrieb:
> Walter K. schrieb:
>> Sicher - aber es ist sozusagen eine Stil-Frage!
>
> Und ist der "Stil" falsch? Oder einfach nur nicht dein Stil?

Hängt davon ab, was man will, siehe hier:

https://stackoverflow.com/questions/7959573/declaring-variables-inside-loops-good-practice-or-bad-practice

Note however that the variable is not supposed to retain its value 
between each loop.

von Walter K. (walter_k488)


Lesenswert?

Samuel C. schrieb:
> Walter K. schrieb:
>> Sicher - aber es ist sozusagen eine Stil-Frage!
>
> Und ist der "Stil" falsch?

Du wirst es mir sicher sagen ;-)

Abgesehen davon kenne ich nur schlechten oder guten Stil - oder halt 
noch die Eigenschaft: stillos

Auf jeden Fall sollte man einem C Einsteiger bei simpelsten 
Fragestellungen nicht solchen Mist vorsetzen!
Und in diesen Kontext hier, ist eine Varianlendeklaration innerhalb 
einer for Schleife einfach nur grober Unfug - ganz unabhängig davon, zu 
welcher Magie heutige compiler fähig sind.

: Bearbeitet durch User
von Einer K. (Gast)


Lesenswert?

VIISA schrieb:
> for(i = 0; i < 144; i++) // <-- ist das der Schleifenkopf?

Ja, das ist der  Schleifenkopf.


Offensichtlich gefällt (i+1) hier nicht, warum auch immer.

Walter K. schrieb:
> Wer hat Dir gelehrt, Variablen in der Schleife zu deklarieren?
Was gibt es gegen lokale Variablen zu sagen?


Für die unerbittlichen:
1
for(int i=0, j=1; i < 144; i++,j++)

von Walter K. (walter_k488)


Lesenswert?

Arduino Fanboy D. schrieb:
>
> Für die unerbittlichen:for(int i=0, j=1; i < 144; i++,j++)

LOL

Das ist jetzt sicher „Arduino C" - Stil? ;-)

von Einer K. (Gast)


Lesenswert?

Walter K. schrieb:
> LOL
Du kennst dich ja offensichtlich aus....

> Was gibt es gegen lokale Variablen zu sagen?
Keine Antwort darauf?

von Samuel C. (neoexacun)


Lesenswert?

Walter K. schrieb:
> Samuel C. schrieb:
>> Walter K. schrieb:
>>> Sicher - aber es ist sozusagen eine Stil-Frage!
>>
>> Und ist der "Stil" falsch?
>
> Du wirst es mir sicher sagen ;-)

Nein, im Gegenteil. Wenn ich eine Variable nur lokal und nicht über 
Iterationen hinweg benötige, dann schreibe ich das auch so. Ich lasse 
mir aber gerne erklären, warum manche meiner Angewohnheiten Nachteile 
haben. Ich sehe in dieser Schreibweise aber kein Problem.

> Abgesehen davon kenne ich nur schlechten oder guten Stil - oder halt
> noch die Eigenschaft: stillos
Und ist der dann gut oder schlecht oder stillos?

> Auf jeden Fall sollte man einem C Einsteiger bei simpelsten
> Fragestellungen nicht solchen Mist vorsetzen!
Ich empfinde das nicht als Mist. Auch nicht für Einsteiger.

> Und in diesen Kontext hier, ist eine Varianlendeklaration innerhalb
> einer for Schleife einfach nur grober Unfug - ganz unabhängig davon, zu
> welcher Magie heutige compiler fähig sind.
Das ist dann aber auch wieder eine Stil-Frage! Sollte (i+1) hier 
mehrfach benötigt werden, kann es je nach Code und Anwendungsfall 
durchaus lesbarer sein, dass in eine eigene Variable auszulagern.

: Bearbeitet durch User
von Einer K. (Gast)


Lesenswert?

Samuel C. schrieb:
> Nein, im Gegenteil. Wenn ich eine Variable nur lokal und nicht über
> Iterationen hinweg benötige, dann schreibe ich das auch so. Ich lasse
> mir aber gerne erklären, warum manche meiner Angewohnheiten Nachteile
> haben. Ich sehe in dieser Schreibweise aber kein Problem.
Dem stimme ich ausdrücklich zu!

Walter K. schrieb:
> Und in diesen Kontext hier, ist eine Varianlendeklaration innerhalb
> einer for Schleife einfach nur grober Unfug - ganz unabhängig davon, zu
> welcher Magie heutige compiler fähig sind.
Zu der Behauptung fehlt die Begründung.
Und ich befürchte, dass es da keine gibt.
Dass es nur ein sinnentleertes Dogma ist.
Klarer: Die Behauptung ist Unfug.

von Zoidberg (Gast)


Lesenswert?

"Wer hat Dir gelehrt, Variablen in der Schleife zu deklarieren?"

Ich muss irgendwie mit dem Kopf schütteln und verstehe dein Gerumpel 
nicht....
Was ist denn genau dein Problem mit lokalen Variablen? Speziell bei 
Anfänger-Fragen sollte man vor allem nicht so poltern.

P.S. Der Code-Schnipsel ist mMn. exakt und absolut richtig für das 
Problem. Sollte er da eine globale Variable für einführen?

von Falk B. (falk)


Lesenswert?

Dieter R. schrieb:
> Hängt davon ab, was man will, siehe hier:
>
> 
https://stackoverflow.com/questions/7959573/declaring-variables-inside-loops-good-practice-or-bad-practice
>
> Note however that the variable is not supposed to retain its value
> between each loop.

Na Klasse! Eine lokale, nicht statische Variable in einer Schleife! So 
nützlich wie ein Kropf!

von Zoidberg (Gast)


Lesenswert?

Nicht unbedingt:

wenn man die in Berechnungen benutzt, kann das die Lesbarkeit erheblich 
verbessern und darum gehts eigentlich bei der Diskussion.
Dass in Berechnungen (i+1) verwendet werden kann ist, denke ich, allen 
klar und irgendwie scheint das dem TO nicht so zuzusagen.

Warum ist denn Übersicht und Lesbarkeit überflüssig. Und vor allem 
verstehe ich nicht, dass ihr alle direkt schreit.

von A. S. (Gast)


Lesenswert?

Falk B. schrieb:
> Na Klasse! Eine lokale, nicht statische Variable in einer Schleife! So
> nützlich wie ein Kropf!

Ja.
Weil statisch keinen Sinn macht (sie wird in der ersten Zeile neu 
gesetzt.
Weil sie außerhalb der Schleife nicht gebraucht wird (sie also genau 
angemessenen Scope hat)

Ob ihr Name (i_inc) sinnvoll ist? Geschenkt.
Ob sie in dem Beispiel sinnvoll ist? Bei einer Verwendung? Sicher nicht. 
Aber das Beispiel war ein Beispiel. Und wenn an 3 Stellen i+1 steht, 
dann ist das Konstrukt an sich richtig.

von Vn N. (wefwef_s)


Lesenswert?

Walter K. schrieb:
> Sicher - aber es ist sozusagen eine Stil-Frage!
>
> Und da der Fragesteller offensichtlich gerade mit C anfängt - wundere
> ich mich schon über den ein oder anderen Beitrag hier!

Richtig - nämlich eine Frage des guten Stils. Variablen so lokal 
deklarieren wie möglich.

Walter K. schrieb:
> Auf jeden Fall sollte man einem C Einsteiger bei simpelsten
> Fragestellungen nicht solchen Mist vorsetzen!

Warum genau soll es Mist sein?

Walter K. schrieb:
> Und in diesen Kontext hier, ist eine Varianlendeklaration innerhalb
> einer for Schleife einfach nur grober Unfug

Ach? Na da dann erklär doch mal, warum das so sein soll?

Walter K. schrieb:
> ganz unabhängig davon, zu
> welcher Magie heutige compiler fähig sind.

Was soll daran Magie sein?

Walter K. schrieb:
> Arduino Fanboy D. schrieb:
>>
>> Für die unerbittlichen:for(int i=0, j=1; i < 144; i++,j++)
>
> LOL
>
> Das ist jetzt sicher „Arduino C" - Stil? ;-)

Valides C seit anno immerschon. Scheinst ja ein richtiger Experte zu 
sein?

Falk B. schrieb:
> Na Klasse! Eine lokale, nicht statische Variable in einer Schleife! So
> nützlich wie ein Kropf!

Offenbar spricht da ein Praktiker. Oder so.

von Dirk B. (dirkb2)


Lesenswert?

vn n. schrieb:
> Walter K. schrieb:
>> Arduino Fanboy D. schrieb:
>>>
>>> Für die unerbittlichen:for(int i=0, j=1; i < 144; i++,j++)
>>
>> LOL
>>
>> Das ist jetzt sicher „Arduino C" - Stil? ;-)
>
> Valides C seit anno immerschon.

Erst seit 20 Jahren (mit C99, aber immer noch aus dem letzten 
Jahrtausend)

von leo (Gast)


Lesenswert?

Falk B. schrieb:
> Na Klasse! Eine lokale, nicht statische Variable in einer Schleife! So
> nützlich wie ein Kropf!

Aha, ein Eggsberde.
Der erste Google-Hit, erster Satz:
"It is a common practice to declare variables near first use. "
nach Suche von: "c best practices variable declaration".

Das hat sich in der Praxis schon lange bewährt. Du brauchst halt einfach 
nicht suchen, wie die Variable deklariert ist. Ob innerhalb einer 
Schleife oder nicht ist vollkommen egal, der Compiler macht eine lokale 
Variable daraus und fertig.

leo

von Darth Moan (Gast)


Lesenswert?

Dirk B. schrieb:
>> Walter K. schrieb:
>>> Arduino Fanboy D. schrieb:
>>>>
>>>> Für die unerbittlichen:for(int i=0, j=1; i < 144; i++,j++)
>>>
>>> LOL
>>>
>>> Das ist jetzt sicher „Arduino C" - Stil? ;-)
>>
>> Valides C seit anno immerschon.
>
> Erst seit 20 Jahren (mit C99, aber immer noch aus dem letzten
> Jahrtausend)

Also im K&R C Programming Language Second Edition von 1988 ist das
schon drin. Ich war der Meinung, das war in der Ersten auch schon drin,
finde aber gerade keine 1978er Ausgabe. Kann es also nicht nachschauen.

von Darth Moan (Gast)


Lesenswert?

O

Darth Moan schrieb:
>>>>> Für die unerbittlichen:for(int i=0, j=1; i < 144; i++,j++)

Darth Moan schrieb:
> Also im K&R C Programming Language Second Edition von 1988 ist das
> schon drin. Ich war der Meinung, das war in der Ersten auch schon drin,
> finde aber gerade keine 1978er Ausgabe. Kann es also nicht nachschauen.

Oh, stimmt gar nicht:
for(i=0, j=1;...
gab es damals schon.
for(int i=0, j=1; ...
Das gab es erst später.

Da hab ich nicht genau genug gelesen, sorry.

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.