Ankündigung

Einklappen

Serverwartung 21.2.



Am 21.2. im Laufe des späten Abends wird eine Serverwartung durchgeführt. Das Forum ist dadurch für gut zwei Stunden nicht erreichbar.
Es wird eine Wartungsseite geschaltet.

Mehr anzeigen
Weniger anzeigen

"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