-         

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 14

Thema: Frage zu for-Schleife

  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.02.2005
    Beiträge
    385

    Frage zu for-Schleife

    Anzeige

    Hi,
    sagem wir mal ich will eine Schleife von x nach y schreiben. Ich weiß aber nicht, ob x größer oder kleiner als y ist. Gibts ne einfache Möglichkeit das so zu schreiben, dass ich nicht immer ne if-Abfrage machen muss um herauszufinden ob x inkrementiert oder dekrementiert werden muss???

    Code:
    int i=0;
    for(i=x; i<=y; ??) {
        /* ... */
    }
    In Bascom ging das indem man hinter "STEP" ne Variable gehängt hat, die -1 bzw +1 enthielt. Gibts sowas ähnliches auch in C?

    mfg
    jagdfalke

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Alter
    48
    Beiträge
    2.731
    Wenn man nicht weiss welcher Wert grösser ist, kann man die Abfrage in der Mitte nur auf != abfragen, sonst läuft die Schleife evtl. länger als vorgesehen.
    Ansonsten könnte man schon hinten schreiben i=i+step, und step auf -1 setzen.
    Evtl. gehts auch so:
    Code:
    for(i = x; i != y; i+= (x<y ? 1: -1))

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.02.2005
    Beiträge
    385
    danke, das mit dem != hätte ich eigentlich auch rausfinden müssen aber "i+= (x<y ? 1: -1)" !? Kannst du mal erklären was der da macht?

    mfg
    jagdfalke

  4. #4
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    Das ist "if else " ohne "if else"
    i += (x<y ? 1: -1)
    if (x < y) i += 1; else i -= 1;


    EDIT: Noch was: Das macht er bei jeder schleife, also high-performance ist das nicht
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.02.2005
    Beiträge
    385
    Also schreibe ich das einmal vor die Schleife und in die Schleife dann i+=i. So müsste es dann gehen. Danke.

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    02.11.2005
    Alter
    42
    Beiträge
    1.140
    Geht auch einfacher:

    Code:
    for(i=0; i<(abs(x-y)); i++)
    askazo

  7. #7
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.02.2005
    Beiträge
    385
    hä? Wenn ich i von 0 an laufen lassen soll und dann die Servoposition gleich i setzt kommt doch bewegungstechnisch nur Shice raus. Dann springt der immer auf 0 und dann zur Differenz.

  8. #8
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    02.11.2005
    Alter
    42
    Beiträge
    1.140
    Ach so, wenn Du in der Schleife die Werte von x bzw. y brauchst, geht das so natürlich nicht.
    Wußte ja nicht, dass es für ne Servoansteuerung ist....

    Dann ist die Lösung von Linux schon ok.
    Also schreibe ich das einmal vor die Schleife und in die Schleife dann i+=i. So müsste es dann gehen.
    Das wäre allerdings Blödsinn.
    i wird ja schon in der Schleifendeklaration (kann man das so nennen?) inkrementiert bzw. dekrementiert....

    askazo

  9. #9
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.02.2005
    Beiträge
    385
    Also ich glaube wir reden etwas aneinander vorbei:
    Code:
    int move_elbow_to(int dest_pos) {
    	int step = 0;
    	if(elbow_pos > dest_pos) { step=-1; }
    	if(elbow_pos < dest_pos) { step=1; }
    	if(step == 0) { return 1; }
    
    	int i=0;
    	for(i=elbow_pos; i!=dest_pos; i += step) {
    		move(3, i);
    	}
    	elbow_pos = i;
    	return 0;
    }
    So hab ich mir das gedacht. So gehts jedenfalls. Kann man den Code noch optimieren?

    mfg
    jagdfalke

  10. #10
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    Du kannst ein bißchen sparen:
    Code:
    int move_elbow_to(int dest_pos) 
    { 
         int step = 1;                
         if(elbow_pos > dest_pos)  step=-1;
         while (elbow_pos !=dest_pos) 
        { 
               elbow_pos += step;
               move(3, elbow_pos); 
        }   
        return 0; 
    }
    DU nimmst einfach +1 an, nur wenn < angesagt ist, mußt du das noch ändern.
    Auf pos == dest fragt ja eh' schon die while-schleife ab, brauchst du nicht extra nochmal "iffen"

    "i" ist überflüssig.

    der erste move wäre mit der alten position --> also sinnlos

    daher bleibt für ein "for" nix über, also while

    der step VOR dem move

    btw:
    Du solltest "step" gleich definieren wie elbow_pos, also nicht unbedingt "int", wenn vielleicht pos nur ein char ist

    Nicht berücksichtigt, was es mit dem Return-value auf sich hat, sonst kann man das auch noch schmeissen
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •