Ankündigung

Einklappen
Keine Ankündigung bisher.

Division durch Null trotz vorheriger Abfrage des Divisors

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

    Division durch Null trotz vorheriger Abfrage des Divisors

    Im Ereignisspeicher finde ich folgende Meldungen:

    % Event: __WS2225_WindDir_455__wertesum..:ERR_DIVISION_BY_Z ERO@2015-07-06 21:12:50
    % Event: __WS2225_WindDir_455__wertesum..:ERR_PROC_OBJECT@2 015-07-06 21:12:50
    % Event: __WS2225_WindDir_455__wertesum..:ERR_DIVISION_BY_Z ERO@2015-07-06 21:18:50
    % Event: __WS2225_WindDir_455__wertesum..:ERR_PROC_OBJECT@2 015-07-06 21:18:50
    % Event: __WS2225_WindDir_455__wertesum..:ERR_DIVISION_BY_Z ERO@2015-07-06 21:20:50
    % Event: __WS2225_WindDir_455__wertesum..:ERR_PROC_OBJECT@2 015-07-06 21:20:50
    % Event: __WS2225_WindDir_455__wertesum..:ERR_DIVISION_BY_Z ERO@2015-07-06 21:24:50
    % Event: __WS2225_WindDir_455__wertesum..:ERR_PROC_OBJECT@2 015-07-06 21:24:50
    % Event: __WS2225_WindDir_455__wertesum..:ERR_DIVISION_BY_Z ERO@2015-07-06 21:29:50
    % Event: __WS2225_WindDir_455__wertesum..:ERR_PROC_OBJECT@2 015-07-06 21:29:50
    .....

    Also wird angeblich eine Division durch Null versucht...

    Im Code wird das jedoch abgefangen:

    Code:
    if second()==50 then {
        wert50@ = windDirGrad@;
        if (wert50@ > 0u16) then {
            divisor50@ = 1u16;
        } else {
            divisor50@ = 0u16;
        } endif;
        divisorsumme@ = divisor00@ + divisor10@ + divisor20@ + divisor30@ + divisor40@ + divisor50@;
        wertesumme@ = wert00@ + wert10@ + wert20@ + wert30@ + wert40@ + wert50@;
       [COLOR=#FF0000] if ([B]divisorsumme@ > 0u16[/B]) then[/COLOR] {
            [COLOR=#008000]Name_WindDir = [B]wertesumme@ / divisorsumme@[/B];[/COLOR]
        } else {
            Name_WindDir = 0u16;
        } endif;
    } endif
    D.h., in jeder 50. Sekunde wird die Summe der Windrichtungswerte der vorangegangenen Minute berechnet und daraus der Durchschnitt gebildet.

    Da ein Windrichtungswert von Null jedoch "Windstille" bedeutet (nur 360° ist daher Nordwind), wird der Wert nicht berücksichtigt und dadurch der Divisor reduziert. Der Divisor "Divisorsumme@" kann also durchaus bei Winstille über einer Minute mal den Wert Null annehmen. Allerdings sollte das wohl mit obigem Konstrukt abgefangen sein...

    Und ja - das ist die einzige Zeile im Makro, das diese Rechnung durchführt, ganz sicher!


    #2
    Das mit dem Code Abfangen ist nett, bringt aber nix. Siehe diesen Beitrag hier und weiter unten hier.Es müßte zu tief in die Firmware eingegriffen werden hat Miachel damals erklärt.

    Gruß,
    Bernd

    Kommentar


      #3
      Hmm, danke Bernd!

      Allerdings finde ich so etwas alles andere, als lustig und nenne es einen fetten Bug!

      Auch wenn es "tief" in der FW liegen sollte, muss so etwas auf Dauer bereinigt werden.

      Kommentar


        #4
        probeire es einmal mit
        Code:
         [COLOR=#FF0000]if ([B]divisorsumme@ [/B][U][B]!= [/B][B]0u16[/B])[/U] then[/COLOR] {
        EPIX
        ...und möge der Saft mit euch sein...
        Getippt von meinen Zeigefingern auf einer QWERTZ Tastatur

        Kommentar


          #5
          Jain. Wie die Firmware intern arbeitet, kann mir eigentlich egal sein. Aber ich gebe Dir absolut Recht das eine Fehlermeldung nicht auftraten sollte, wenn die Division durch null eigentlich programmtechnisch abgefangen wurde. Insofern ist da sicher Handlungsbedarf seit 2011 ...

          Gruß,
          Bernd

          Kommentar


            #6
            Zitat von EPIX Beitrag anzeigen
            probeire es einmal mit
            Code:
            [COLOR=#FF0000]if ([B]divisorsumme@ [/B][U][B]!= [/B][B]0u16[/B])[/U] then[/COLOR] {
            Als ich den Thread verfasst habe, habe ich genau diese Änderung im Code vorgenommen. Allerdings wird's nicht extra geflasht, erst im Zuge weiterer Änderungen.

            Aber trotzdem Danke!

            Kommentar


              #7
              Zitat von klaus_kraemer Beitrag anzeigen
              Als ich den Thread verfasst habe, habe ich genau diese Änderung im Code vorgenommen. Allerdings wird's nicht extra geflasht, erst im Zuge weiterer Änderungen.
              Wird aber nichts ändern, wenn der beschriebene Bug immer noch besteht, oder?

              Ich habe seit damals folgende Hilfskonstruktion in Verwendung (in etwa):
              0. Hilfsvariable mit Startwert != 0
              1. Bei Event (=change) wird eine Hilfsvariable auf 1 (oder einen beliebigen anderen Startwert != 0 gesetzt) -> weiß grad nicht warum, ist eigentlich nicht notwendig
              2. Eigentliche Variable auf Wert 0 prüfen und nur falls größer in die Hilfsvariable kopieren und die entsprechende Berechnung mit der Hilfsvariable durchführen.

              Somit kann die Berechnung nie durch 0 vorkommen.
              BR
              Marc

              Kommentar


                #8
                Zitat von saft6luck Beitrag anzeigen

                Wird aber nichts ändern, wenn der beschriebene Bug immer noch besteht, oder?
                ...
                Vermute ich auch, aber lasse mich gerne überraschen.

                Kommentar


                  #9
                  Zitat von bmx Beitrag anzeigen
                  .Es müßte zu tief in die Firmware eingegriffen werden hat Miachel damals erklärt.
                  Nee, es wurde dann auch tief in die FW eingegriffen, weil damit an auch anderer Stelle Performance gewonnen wurde.
                  Warum das event kommt, weiß ich nicht. Das muss ich hier erst mal abklären bzw. ist das ein Bug und ich hab das mal aufgenommen in die Bugliste.
                  offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
                  Enertex Produkte kaufen

                  Kommentar

                  Lädt...
                  X