Denkanstoss für for-Schleife



  • Hallo liebes Forum,

    ich habe ein Problem, welches ich mithilfe einer for-schleife abbilden möchte.
    Also Folgendes:

    ich habe eine fortlaufende Folge von Ganzzahlen von 0 - 5.
    Diese dienen als Index für Daten.

    Ich bekomme in der Funktion aber maximal die 1 -5 als Index übergeben, da die 0 so eine Art Pseudoindex ist. Die 0 gehört zur 1 logisch dazu und müsste dann bearbeitet werden.
    Nun möchte ich nicht eine extra If Bedingung einbauen und die ganze Logik für den Fall 1, nochmals dann für den Fall 0 implementieren.

    Ich dachte nun an eine for-Schleife, die man im kopf entsprechend steuert, dass wenn 1 übergeben wurde, er über 1 und 0 läuft, ansonsten nur über den übergebenen Index.
    Leider fällt mir keine Bedingung ein, die dieses ermöglicht.

    Ich hoffe ich konnte mich verständlich ausdrücken.



  • Lass die Schleife von 1..5 laufen, wenn du 1..5 brauchst und lass sie 0..5 laufen wenn du 0..5 brauchst.
    Rumfrickelei bringt hier wenig bzw. ist nur eine Fehlerquelle mehr und trägt zur Unübersichtlichkeit bei.



  • hmm vielleicht hast du Recht.
    Ich habs nun so gelöst:

    .
    .
    .
    int typ =0;
    for( typ = (( param == 1 ) ? 0 : param); typ <= param; typ++ )
    .
    .
    .
    

    Sollte seinen Zweck erfüllen und verständlich sein mit einem Kommentar.



  • Das ist auch nur ein verkapptes if



  • ... aber dafür schlechter lesbar/verständlich.



  • grübler schrieb:

    Ich habs nun so gelöst:

    .
    .
    .
    int typ =0;
    for( typ = (( param == 1 ) ? 0 : param); typ <= param; typ++ )
    .
    .
    .
    

    Bist du sicher, dass es das tut, was es soll? Die Schleife wird nur im Fall param = 1 mehrmals ausgeführt - nämlich 2x - in allen anderen Fällen nur 1x, weil typ dann von param bis inklusive param läuft.

    Und das ist dann, wie Belli und DirkB schon gesagt haben, schlecht lesbar und (die for-Schleife) schlecht verständlich angewendet.



  • @GyroGearloose: genau so soll sie arbeiten.

    Mir ist schon klar dass der Bedingungsoperator nur ein If ersetzt.
    Das Problem ist aber, dass ich innerhalb der Schleife auch noch an weiteren Stellen Unterscheiden müsste, und auch noch einige verschachtelte Schleifen kommen.

    Würde ich nun in dieser einen for-SChleife den zähler, bzw. Parameterindex nicht umsetzen, müsste ich für den Spezialfall 1,0 die SChleifen kopieren und den Code so unnötig aufblähen.



  • grübler schrieb:

    @GyroGearloose: genau so soll sie arbeiten.

    Mir ist schon klar dass der Bedingungsoperator nur ein If ersetzt.
    Das Problem ist aber, dass ich innerhalb der Schleife auch noch an weiteren Stellen Unterscheiden müsste, und auch noch einige verschachtelte Schleifen kommen.

    Würde ich nun in dieser einen for-SChleife den zähler, bzw. Parameterindex nicht umsetzen, müsste ich für den Spezialfall 1,0 die SChleifen kopieren und den Code so unnötig aufblähen.

    Func(0)

    For i : 1
    Func(i)

    ...



  • Dann lagere den Schleifenrumpf doch lieber in eine eigene Funktion aus.

    Ich würde es so machen:

    // Hier steht WARUM die 1 ein Spezialfall ist
    if (param == 1)
        processData(0);
    
    processData(param);
    

    Man erkennt am Code gleich folgende Dinge:

    • Der allgemeine Fall ist processData(param)
    • param == 1 ist ein Spezialfall, der zusätzlich und vor dem allgemeinen Fall ausgeführt wird

    In dem Kommentar sollte nichts stehen, was der Code nicht schon aussagt. Also nicht, dass das ein Spezialfall ist, sondern warum er es ist.
    Wenn der Name für processData gut gewählt wird, kann man den Kommentar vielleicht sogar sparen.

    Das ist für den Nachfolger1, der mal deinen Code lesen wird, wesentlich besser zu verstehen.

    ______________________

    1. Zum Beispiel der Herr Zukunftsgrübler 😉

Anmelden zum Antworten