mikrocontroller.net

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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: VIISA (Gast)
Datum:

Bewertung
-3 lesenswert
nicht lesenswert
Hi,

ich komme gerade nicht weiter. Und zwar habe ich eine normale 
forschleife

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

Autor: Zoidberg (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: N. M. (mani)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
uint16_t blub =0;

for(uint8_t i = 0; i < 144; i++) 
{
  blub = i+(i+1); //z.B 50+51
  //Mach was mit blub
}

Autor: A. S. (achs)
Datum:

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

Autor: VIISA (Gast)
Datum:

Bewertung
-1 lesenswert
nicht 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

Autor: Mr. Meeseeks look at me (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: devzero (Gast)
Datum:

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

Autor: devzero (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok bei 1 beginnen

Autor: Falk B. (falk)
Datum:

Bewertung
0 lesenswert
nicht 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?
  for (i = 0; i < 144; i++) {
    a = b * (i+1);
  }

> 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
Autor: Samuel C. (neoexacun)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Mr. Meeseeks look at me (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Samuel C. (neoexacun)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Walter K. (walter_k488)
Datum:

Bewertung
0 lesenswert
nicht 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?
> 
> 
>
> 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

Autor: Zoidberg (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 );
}

Autor: Walter K. (walter_k488)
Datum:

Bewertung
-2 lesenswert
nicht 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?

Autor: 123456 (Gast)
Datum:

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

Mecker nicht, der Compiler wird diesen Fall hervorragend richten.

Autor: Walter K. (walter_k488)
Datum:

Bewertung
-3 lesenswert
nicht 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!

Autor: Samuel C. (neoexacun)
Datum:

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

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

Autor: Dieter R. (drei)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Walter K. (walter_k488)
Datum:

Bewertung
-4 lesenswert
nicht 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
Autor: Arduino Fanboy D. (ufuf)
Datum:

Bewertung
2 lesenswert
nicht 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:
for(int i=0, j=1; i < 144; i++,j++)

Autor: Walter K. (walter_k488)
Datum:

Bewertung
-5 lesenswert
nicht 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? ;-)

Autor: Arduino Fanboy D. (ufuf)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Walter K. schrieb:
> LOL
Du kennst dich ja offensichtlich aus....

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

Autor: Samuel C. (neoexacun)
Datum:

Bewertung
1 lesenswert
nicht 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
Autor: Arduino Fanboy D. (ufuf)
Datum:

Bewertung
0 lesenswert
nicht 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.

: Bearbeitet durch User
Autor: Zoidberg (Gast)
Datum:

Bewertung
2 lesenswert
nicht 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?

Autor: Falk B. (falk)
Datum:

Bewertung
-4 lesenswert
nicht 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!

Autor: Zoidberg (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: A. S. (achs)
Datum:

Bewertung
4 lesenswert
nicht 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.

Autor: vn n. (wefwef_s)
Datum:

Bewertung
2 lesenswert
nicht 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.

Autor: Dirk B. (dirkb2)
Datum:

Bewertung
1 lesenswert
nicht 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)

Autor: leo (Gast)
Datum:

Bewertung
2 lesenswert
nicht 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

Autor: Darth Moan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Darth Moan (Gast)
Datum:

Bewertung
1 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.