mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik For Schleife nur bestimmte Werte hochzählen lassen


Autor: Christoph R. (nexor)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

habe eine Software für einen Kabeltestet entwickelt. Soweit funktioniert 
diese auch. Aber nur wenn man eine 1 zu 1 Verbindung hat. Wenn man jezt 
Leitungen testen möchte die gewollt verdreht sind. Wie kann ich ihm 
sagen das er in der For-Schleife nicht von 1 bis 9 hoch zählen soll 
sondern z.b. erst 2 dann 5 dann 8 usw.

Schöne Grüße

Christoph

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
uint_8 x[] = {5,2,7,3,9,7,1,4};
for( uint_8 i = 0; i < sizeof(x) ++i ) {
   print("%d\n", x[i] );
}


aber ob die das was weiterhilft weiss ich nicht, du hast ja nicht mal 
die Programmiersprache verraten.

Autor: R. Freitag (rfr)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Verpacke die zu verwendenden Werte in einem Array und schiebe den Index 
linear weiter.

Gruss

Robert

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ganz einfach,
for i in 2 5 8

...wenn deine Programmiersprache diese Art der for-Schleife unterstützt. 
Du hast ja nicht verraten, welche Sprache du gerade verwendest.

Ansonsten heisst das Zauberword Array.

Oliver

Autor: Christoph R. (nexor)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ah sorry. ^^ Natürlich C. Ich programmiere im AVR Studio 4. AVR GCC. 
Controller ist ein AT90CAN128. Also vorher in einer Variablen die Werte 
hineinschreiben und in der Bedinung wieder aufrufen.

Autor: Christoph R. (nexor)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok vielen Dank schonmal. Habe ein Script über Arrays gefunden. Ich denke 
damit werde ich es hinbekommen.

Autor: Christoph R. (nexor)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich bin jetzt folgendermaßen vorgegangen:

...
int x[9]={9,2,3,4,5,6,7,8,1};
int i;
...
for(i=0; i<10; ++i){long_delay(5); i[z]; PORTC=i}

Er zählt von 1 bis 9 hoch. Bleibt bei 9 stehen. Wenn ich in die Klammer 
"i<sizeof(x)" schreibe zählt er bis 15.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christoph R. schrieb:
> Ich bin jetzt folgendermaßen vorgegangen:
>
> ...
> int x[9]={9,2,3,4,5,6,7,8,1};
> int i;
> ...
> for(i=0; i<10; ++i){long_delay(5); i[z]; PORTC=i}

Welche Werte nimmt denn i an?

  0 1 2 3 4 5 6 7 8 9


Zähl nach. Das sind 10 Werte, nicht 9

Dein Array hat aber nur 9 Elemente!

Merkregel
Bei einer Arraydefinition gibt man die Anzahl der Elemente an. Der 
höchste zulässige Index ist immer um 1 kleiner als diese Zahl

Ein Array

   int x[9]

besteht aus

  x[0]  x[1]  x[2]  x[3]  x[4]  x[5]  x[6]  x[7]  x[8]

zähl wieder nach. Das sind 9 Array-Elemente wie von der Definition 
gefordert. Beachte auch: Das letzte Array Element hat den Index 8!


>
> Er zählt von 1 bis 9 hoch. Bleibt bei 9 stehen. Wenn ich in die Klammer
> "i<sizeof(x)" schreibe zählt er bis 15.

kein Wunder. sizeof liefert die Größe in Bytes und nicht in int 
Einheiten

die Anzahl der Elemente in einem Array kann man so bestimmen

sizeof(x)/sizeof(x[0])

also: Gesamtgröße in Bytes / Größe eines Elementes in Bytes

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Habe ein Script über Arrays gefunden

Besser wäre es, wenn du dir ein richtiges C-Buch kaufst und 
durcharbeitest.

Autor: Frank Bär (f-baer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christoph R. schrieb:
> Wie kann ich ihm
> sagen das er in der For-Schleife nicht von 1 bis 9 hoch zählen soll
> sondern z.b. erst 2 dann 5 dann 8 usw.
>
> Schöne Grüße
>
> Christoph

Ganz einfach: for(i=2 ; i<ENDE ; i+=3) {}


> int x[9]={9,2,3,4,5,6,7,8,1};
> int i;
> ...
> for(i=0; i<10; ++i){long_delay(5); i[z]; PORTC=i}

Der Code macht nicht nur keinen Sinn, er ist auch noch ziemlich 
bescheuert.

Autor: Christoph R. (nexor)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja so zählt er immer um 3 hoch. Er soll aber flexibel sein. So dass ich 
ihm vorher sage zähle so und so hoch. Die For Schleifen sollen 
unverändert bleiben.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Frank Bär schrieb:
>> for(i=0; i<10; ++i){long_delay(5); i[z]; PORTC=i}
>
> Der Code macht nicht nur keinen Sinn, er ist auch noch ziemlich
> bescheuert.

ja das i[z]; sieht schon ein wenig merkwürdig aus.

Autor: Christoph R. (nexor)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe da nur etwas rumgespielt. Es funktioniert ja auch nicht. Deswegen 
schreibe ich ja hier. ^^

Autor: Frank Bär (f-baer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christoph R. schrieb:
> Ja so zählt er immer um 3 hoch. Er soll aber flexibel sein. So dass ich
> ihm vorher sage zähle so und so hoch. Die For Schleifen sollen
> unverändert bleiben.

Er macht genau das, was dein Minimalbeispiel verlangte.

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.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

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