Ankündigung

Einklappen
Keine Ankündigung bisher.

"Unerlaubte Rekursion" in Makro

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    "Unerlaubte Rekursion" in Makro

    Wenn ich versuche, eine lokale Makrovariable zu verändern, bekomme ich die Fehlermeldung "Unerlaubte Rekursion":


    +---+ EibParser - v4.111 (Windows 64 Bit Version) +---+ Keine Haftung für Schäden, die durch die Benutzung des Programms entstehen. Len:59 Len:59 Datei: "S:\EIB_KNX\EibPC2-Projekte\Amselweg7-EibPC01_tmp\tmpMacroOut.txt" wurde geschrieben !! Anwendungsfehler !! !Unerlaubte Rekursion >__Daylightcorrection_663__Luxwert=f(__Daylightc or rection_663__Luxwert)< EC:7 EibParser wurde mit Fehler beendet.

    Das Makro (aufgrund der Fehlersuche immer mehr abgespeckt, deshalb soll dessen Sinnhaftigkeit hier nicht diskutiert werden...):
    Code:
    :begin Daylightcorrection(pLux)
    :info $Passt den Zeitpunkt der Lamellenposition an die Jahreszeit an, im Winter früher, im Sommer später$
    
    //:var MaxAbweichungLux@
    :var Luxwert@
    //:var DaysThisYear@
    //:var DayOfYear@
    //:var Luxkorrektur@
    //MaxAbweichungLux@ = 20f32;
    Luxwert@ = convert(pLux, 0f32);
    //DaysThisYear@ = convert(GetNumberOfDaysThisYear(), 0f32);
    //DayOfYear@ = convert(DayOfYear, 0f32);
    //
    //Luxkorrektur@ = -1f32 * cos(PI*2f32*DayOfYear@/DaysThisYear@) * MaxAbweichungLux@;
    
    Luxwert@ = Luxwert@ + 1f32;
    
    :return Luxwert@
    :end
    Der Fehler tritt in der Zeile "Luxwert@ = Luxwert@ + 1f32" auf - Wahnsinn...
    Also ergibt das Erhöhen eines Variablenwerts um 1 (alles andere als Zeilen mit der lokalen :var Luxwert@ habe ich eliminiert) eine Rekursion???? Sind das dann lokale Konstanten? Einmal definiert und unveränderlich? dann sollte das Schlüsselwort nicht :var heißen, sondern :const
    Zuletzt geändert von foobar0815; 26.01.2021, 08:47. Grund: gelöst

    #2
    Nein, die Variable würde inkrementiert, sobald sie sich ändert, was sie ändert, wodurch sie inkrementiert wird, was sie ändert, wodurch...


    Zumal du Luxwert@ zweimal definierst (Zuweisung außerhalb von if).
    ​​​​​​

    Also einfach eine neue Variable LuxwertKorrigiert@ verwenden.

    Kommentar


      #3
      Sorry, bin gerade auch wieder drauf gekommen - war zu lange nicht mehr am EibPC...

      So wie vorgeschlagen habe ich es dann auch gelöst.

      Frage aus Interesse: könnte das in einer Funktion durch verlegen des Rechenteils in ein
      if (1b01) then { rechnen.... } endif
      etwas programmiertechnisch verschönert werden?

      Auf jeden Fall Danke!

      Kommentar


        #4
        Gerne

        Ne, weil if 1b01 nur ein einziges mal ausgewertet wird. Danach bleibt die Bedingung konstant und wird deshalb nicht mehr evaluiert, und löst somit auch keine Aktualisierung des then-Teils aus.
        Die Vererbeitung ist nicht Befehl für Befehl sondern wird als Abhängigkeitsbaum modelliert.

        Schön ist, was funktioniert

        Im Ernst: So lange du bei der Objektanzahl nicht am Ende bist, ist es durch das Abhängigkeitsmodell nahezu egal, ob du neue Variable anlegst, oder nicht. Dann lieber klar und nachvollziehbar.

        Kommentar

        Lädt...
        X