Ankündigung

Einklappen
Keine Ankündigung bisher.

Macro pass by Ref

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

    [Handbuch] Macro pass by Ref

    In diesem Macro:
    Code:
    :begin RefTest( var )
    :var v@
    v@ = var
    if( change(v@ ) )then write( "DebugOut-10/4/0",$change:$c14+convert(v@,$$c14)  ) endif
    :end
    ändern sich v@ wenn ich var verändere. v@ ist wohl eine Reference für var.

    Gibt es beim EibPC noch andere Sitauationen wo eine Zuweisungen in der Form :
    Code:
     a = b
    bei der letztendlich a die Variable b referenziert?


    alexander

    #2
    Zitat von asc570 Beitrag anzeigen
    Code:
    ...
    v@ = var
    ...
    ändern sich v@ wenn ich var verändere. v@ ist wohl eine Reference für var.
    Eine Reference wäre es, wenn sich var ändert, wenn du v@ änderst, oder?
    Momentan wird der Wert von var nur v@ zugewiesen.
    BR
    Marc

    Kommentar


      #3
      Zitat von saft6luck Beitrag anzeigen
      Eine Reference wäre es, wenn sich var ändert, wenn du v@ änderst, oder?
      Momentan wird der Wert von var nur v@ zugewiesen.
      Eben nicht!
      Es wirt nicht der Wert von var der Variable v@ zugewiesen, sonder v@ IST eine Referenz zu var!
      Bin darüber gestolpert, weil ich die EibPC Macros wie Functionen benutze, aber es bleiben natülich immer noch Macros!

      Das referenzieren kann man aber auch an andere Stelle gebrauchen.

      alexander

      Kommentar


        #4
        Zitat von asc570 Beitrag anzeigen
        Eben nicht!
        Es wirt nicht der Wert von var der Variable v@ zugewiesen, sonder v@ IST eine Referenz zu var!
        das widerspricht sich:
        ändern sich v@ wenn ich var verändere. v@ ist wohl eine Reference für var.
        Wenn Du v@ änderst und sich dann var mit ändert, dann wäre es eine Referenz. Hier ist es ja bloß eine Zuweisung der Variablen var auf die lokale Variable v@.
        offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
        Enertex Produkte kaufen

        Kommentar


          #5
          Zitat von enertegus Beitrag anzeigen
          das widerspricht sich:
          Wenn Du v@ änderst und sich dann var mit ändert, dann wäre es eine Referenz. Hier ist es ja bloß eine Zuweisung der Variablen var auf die lokale Variable v@.
          Da es sich bei dem Bespiel um ein Macro handelt, ist es natürlich keine Referenz sondern eine "Zweisung", das ist schon richtig.
          Aber bei mir gilt nach der "Zuweisung" immer: v@ == Var, wenn ich Var ändere. Ich habe nicht expliziert ausprobiert, ob das auch gilt, wenn ich v@ ändere, das war für mich naheliegend.
          Du sagst nun, es ist nicht so. Das würde bedeuten, das :
          - ändere ich Var gilt : @v == Var
          - ändere ich @v gilt : @v != Var

          Ich hätte gedacht das:
          1. jede Variable initialisiert werden muß
          2. Die Initialisierung erfolgt durch
          a.) Zuweisung von Wert und Typ ( a = 1b01)
          b.) Zuweisng von "Referenz" zu existierneder anderer Variabler. (a = 1b01; b=a)

          Verstehe ich da etwas falsch?

          alexander

          Kommentar


            #6
            ein "@v == Var" stellt keine bidirektionale Referenz her. Es weißt nur der linken Variable den Inhalt der rechten zu, aber nicht umgekehrt!
            ....und versuchen Sie nicht erst anhand der Farbe der Stichflamme zu erkennen, was Sie falsch gemacht haben!

            Kommentar


              #7
              Zitat von asc570 Beitrag anzeigen
              Ich hätte gedacht das:
              1. jede Variable initialisiert werden muß
              2. Die Initialisierung erfolgt durch
              a.) Zuweisung von Wert und Typ ( a = 1b01)
              b.) Zuweisng von "Referenz" zu existierneder anderer Variabler. (a = 1b01; b=a)

              Verstehe ich da etwas falsch?
              Wie Uwe! schon schreibt bleibt b=a eine Zuweisung, d.h. wenn sich b ändert wird a nicht geändert.

              Für das Verständnis:

              Jede Variable muss deklariert werden, d.h. der Typ der Variable wird festgelegt.
              Der eibPC kennt hierfür kein eigenes Kommando, sondern leitet den Typ vom Typ der Initialisierung ab.
              Initialisiert wird wiederum in der Hauptebene durch eine Zuweisung.

              Soweit klar.

              Nun die Besonderheit (daher keine Referenz):
              Da die Hauptebene zyklisch abgearbeitet wird, werden dort alle Zuweisungen auf Änderung geprüft (Validierungsschema) und entsprechend neu zugewiesen.
              Da sich Konstanten nicht ändern, werden diese dann ignoriert.
              BR
              Marc

              Kommentar


                #8
                Zitat von saft6luck Beitrag anzeigen
                Nun die Besonderheit (daher keine Referenz):
                Da die Hauptebene zyklisch abgearbeitet wird, werden dort alle Zuweisungen auf Änderung geprüft (Validierungsschema) und entsprechend neu zugewiesen.
                Da sich Konstanten nicht ändern, werden diese dann ignoriert.
                Vielen Dank saft6luck,
                darauf wäre ich ja nie gekommen!!

                Heist das, das eine Initialisierung:
                Code:
                v@ = Var
                in pseudo Code etwa dies beim Begin eines jeden Cycles ausführt:
                Code:
                if(systemstart() or change(Var)) then v@ = Var endif
                alexander

                Kommentar


                  #9
                  Zitat von asc570 Beitrag anzeigen
                  Vielen Dank saft6luck,
                  darauf wäre ich ja nie gekommen!!
                  Vielleicht müssen wir intern nochmals das Kapitel zur Valdierung überarbeiten...
                  in pseudo Code etwa dies beim Begin eines jeden Cycles ausführt:
                  Code:
                  if(systemstart() or change(Var)) then v@ = Var endif
                  Exakt!
                  offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
                  Enertex Produkte kaufen

                  Kommentar


                    #10
                    Zitat von enertegus Beitrag anzeigen
                    Vielleicht müssen wir intern nochmals das Kapitel zur Valdierung überarbeiten...
                    Das Problem bei der EibPC Sprache ist, das diese sich einerseits stark an andere Sprachen anlehnt, andererseits durch das "Validierungsschema" aber ganz spezifische Eigenschaften hat die den Erwartungen entgegenlaufen.
                    Das neu Handbuch ist da bei der Aufklährung schon recht gut.

                    Aber, je besser im Handbuch auf diese Abweichungen hingewiesen wir, desto seltener tappt man dann am als Anfänger in diese Fallen.

                    Wenn man trotzdem nicht weiter kommt, ist diese Forum eine große Hilfe!!

                    Danke nochmals,
                    alexander

                    Kommentar


                      #11
                      Wenn wir gerade bei den "lokalen" Variablen sind:

                      Warum, zum Kuckuck, kann man sie nicht in der Deklarationszeile initialisieren?
                      Warum also:
                      :var locvar@
                      locvar@ = 0f32
                      statt
                      :var locvar@ = 0f32
                      wie analog auch die globalen Variablen deklariert und initialisiert werden.

                      Mit der unsäglichen Tendenz zum Widescreen ist jede Codezeile zu viel ein Beitrag zur Unübersichtlichkeit. Und wer am Anfang der Makroprogrammierung steht, stolpert sicher über die unterschiedliche Deklaration lokaler und globaler Variablen.

                      Und noch was:
                      Der Compiler sollte einen Hinweis auf deklarierte,aber nicht benutzte Variable bringen!

                      Kommentar

                      Lädt...
                      X