Ankündigung

Einklappen
Keine Ankündigung bisher.

if -> mehrere Anweisungen

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

    [EibParser] if -> mehrere Anweisungen

    Moin,

    ich stehe grad etwas auf dem Schlauch:
    War es nicht irgendwie möglich, in einer IF-Anweisung mehrere Befehle auszuführen, d.h. z.B. MEHRERE Telegramme zu versenden?

    d.h.

    if (sun()) then a=a+1, b=b+1 endif

    etc.?
    Keine Garantie auf Richtigkeit! Bitte nicht zu Hause nachmachen!

    #2
    Code:
    if (sun()) then  { a=a+1; b=b+1 } endif
    So sollte es klappen ...

    oder im Falle von Telegrammen dann:

    [highlight=epc]if (sun()) then {
    write( GA1, EIN);
    write( GA2, AUS);
    write(GA3, 100u08 )
    } endif[/highlight]So sollte es klappen ...


    Gruß,
    Bernd

    Kommentar


      #3
      Danke, so funktioniert es
      Keine Garantie auf Richtigkeit! Bitte nicht zu Hause nachmachen!

      Kommentar


        #4
        EIBPC-Parser Syntax

        Hallo
        hier eine Frage zur Syntax:
        innerhalb der if then clause werden einzelne Befehlssequenzen mit dem ";" getrennt

        1. ist es ein Fehler auch die letzte Sequenz (vor dem endif) mit einem ; abzuschliessen
        2. sind die ; auch ausserhalb der if then clause erlaubt
        3. könnten die ";" nicht auch die lästigen "\\" ersetzen wie es in manchen Programmiersprachen üblich

        Schöne Feiertage und ein gutes neues Jahr euch noch

        jukom
        Gruß Jukom

        Kommentar


          #5
          Zitat von Jukom Beitrag anzeigen
          innerhalb der if then clause werden einzelne Befehlssequenzen mit dem ";" getrennt
          1. ist es ein Fehler auch die letzte Sequenz (vor dem endif) mit einem ; abzuschliessen
          das geht. Offziell ist die letzte Anweisung ohne ";", aber es geht beides.
          2. sind die ; auch ausserhalb der if then clause erlaubt
          Es geht auch außerhalb also z.B.
          a=2;a2=4;u=sin(3f32)
          als Zeile.
          3. könnten die ";" nicht auch die lästigen "\\" ersetzen wie es in manchen Programmiersprachen üblich
          Du kannst mit {} arbeiten:
          also:
          Code:
          if a then {
          b=2
          } endif
          offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
          Enertex Produkte kaufen

          Kommentar


            #6
            Zitat von enertegus Beitrag anzeigen
            das geht. Offziell ist die letzte Anweisung ohne ";", aber es geht beides.

            Es geht auch außerhalb also z.B.
            a=2;a2=4;u=sin(3f32)
            als Zeile.

            Du kannst mit {} arbeiten:
            also:
            Code:
            if a then {
            b=2
            } endif
            Stimmt; allerdings verursacht ein ";" am Ende OHNE dass etwas weiteres kommt einen Fehler, wenn es die einzige Anweisung in der Zeile ist.

            Könnt ihr bitte das Compilerverhalten bzgl ";" angleichen. Einfach immer erlauben. Danke!

            Kommentar


              #7
              Compilerbau ist doch immer was ekliges

              Aber blöde Frage: Wenn es eine Spezifikation gibt, wo ist das Problem sich dran zu halten?

              Nur weil der Compiler

              a=1;b=2;

              zulässt, muss man es ja nicht unbedingt schreiben.

              So wie ich das jetzt verstanden habe, wird "zeilenorientiert" gearbeitet, {} sowie ; sind "Ausnahmen"...

              Ich würd mich halt dran halten, das macht es sicherer für zukünftige Änderungen...
              Keine Garantie auf Richtigkeit! Bitte nicht zu Hause nachmachen!

              Kommentar


                #8
                Moin Reinold,
                Zitat von rb84 Beitrag anzeigen
                Compilerbau ist doch immer was ekliges
                Ja, ich weiss...habe ich vor laaanger Zeit auch mal gemacht.

                Zitat von rb84 Beitrag anzeigen
                Aber blöde Frage: Wenn es eine Spezifikation gibt, wo ist das Problem sich dran zu halten?
                Könntest du evtl. in Betracht ziehen mal zu überlegen dass eine Spec in seltenen Fällen vielleicht doch mal etwas Verbesserungswürdiges enthält?

                Nur weil etwas irgendwo steht bedeutet das nicht dass es immer richtig/vernünftig ist...

                Zitat von rb84 Beitrag anzeigen
                Nur weil der Compiler
                a=1;b=2;
                zulässt, muss man es ja nicht unbedingt schreiben.
                Nur weil der Compiler das zulässt muss er sich ja nicht unbedingt unterschiedlich in ähnlichen Situation verhalten.
                Die Ausdrücke oben sind bewusst so kurz wie möglich. Bei sind aber oft mehrere Zuweisungen -manchmal mit Zeilenumbrüchen - vorhanden.

                Es ist nun sperrig bei Löschen von vorderen Zuweisungen so zu denken: "bleibt nur noch ein übrig? Dann muss ich das abschliessende ; auch loswerden".

                Zitat von rb84 Beitrag anzeigen
                So wie ich das jetzt verstanden habe, wird "zeilenorientiert" gearbeitet, {} sowie ; sind "Ausnahmen"...
                Schon klar...deshalb aber auch meine Frage ob diese Ausnahme vermieden werden kann.
                Je weniger Ausnahmen/kompakteres Regelwerk desto besser.

                Zitat von rb84 Beitrag anzeigen
                Ich würd mich halt dran halten, das macht es sicherer für zukünftige Änderungen...
                Mal sehen was Michael antwortet.

                Kommentar


                  #9
                  Ja Moment, ich war auf der Schulung bei Enertex und ich hab das eben noch so im Kopf:

                  • Validierungsschema validiert einen Ausdruck (Zeile)
                  • Es wird eben NICHT prozedural gearbeitet, sondern eben mit den "Ausdrücken" bzw. "Validierungsobjekten" oder wie der exakte Begriff war...

                  So, und jetzt mal zum Sinn deiner Programmierung von

                  a=1;b=1;

                  Ja, das ist in Java so zu machen, aber nur, weil eben Zeilenumbrüche nicht interpretiert werden, und weil das Programm "von oben nach unten" durchlaufen wird (zumindest die Methode).

                  Demzufolge bringt:

                  b=a;a=1;

                  in Java einen Compilierfehler, die Variable wurde noch nicht initialisiert!

                  Im EibPC (grad getestet) wird dies vom Compiler akzeptiert!

                  Ich kann mich deshalb überhaupt recht wenig mit deiner Schreibweise anfreunden ("a=1;b=2;") weil ich darin keinen Sinn sehe!

                  MEHR Sinn macht:

                  a=1
                  b=2

                  weil das Ganze unabhängig voneinander ist.

                  So wie ICH das verstanden habe, baut der Compiler eben die "Ausdrücke" oder "Validierungsobjekte".

                  Und deshalb ist es ihm egal, ob du:

                  b=a
                  a=1

                  schreibst, bzw. du hast gar keine SICHERHEIT, dass er den ersten Ausdruck zuerst ausführt.

                  Wenn man das jetzt zum Standard deklariert, dass wie in C oder Java programmiert wird -> Das gibt doch nur Chaos . d.h. du sollst das wohl gar nicht in EINE Zeile schreiben, weil es unlogisch ist...

                  Im Übrigen ist es ja auch so (bitte korrigieren wenn falsch!) dass bei einer IF-Anweisung mit MEHREREN folgenden Anweisungen nicht gesagt ist, dass diese in exakt der Reihenfolge abgearbeitet werden, in der sie in dem Programm stehen!
                  Wenn dort 5 write-Befehle stehen, dann nimmt der EibPC diese in seinen Pufferspeicher und verschickt sie - im Übrigen "irgendwann"! Ich kann nicht davon ausgehen, dass bei meiner Programmierung das nächste Paket, welches auf den BUS gesendet wird, das aus meiner Programmierung ist...
                  Keine Garantie auf Richtigkeit! Bitte nicht zu Hause nachmachen!

                  Kommentar


                    #10
                    Ich stimme dir zu.

                    b=a;a=1; verwende ich gerne um Platz zu sparen. Ist ja schon genug von der Scrollerei im Programm.

                    Es geht nicht um irgendwelche Reihenfolgen sondern nur um das Prg. kompakter zu gestalten!

                    Wenn ich nun
                    b=1;a=1;
                    in
                    Langer_Variablenname_der_nun_nicht_mehr_übersichtl ich_mit_einer_anderen_Zuweisung_in_eine_zeile_pass t=1*3*4*5*6+4; Noch_ein_langer_name_der_vorher_einfach_b_war= = 243421;
                    ändere und die beiden Zuweisungen in zwei Zeilen habe möchte reichts es eben NICHT nur ein <return> einzufügen, sondern ich muss zusätzlich auch noch ein bis zwei ";" entfernen um keine Compilerfehler zu erhalten: Genau das stört mich.

                    Kommentar


                      #11
                      Ganz offiziell: Es steht eine einzelne Anweisung immer ohne ";"
                      2 Anweisungen oder mehr mit ";" wobei die letzte wieder keinen hat.

                      Das es überhaupt geht, so "inkonsequent" wie nun (also optionales ; bei mehrere Anweisungen) war ein Featurewunsch.

                      In der Beta gibt es auch #includes und bald #defines, #ifdef, #undef, #endif so dass die Sache übersichtlicher wird (wobei die akutelle Beta 1.908 noch recht buggy ist).
                      offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
                      Enertex Produkte kaufen

                      Kommentar


                        #12
                        Michael, Danke für die Klarstellung.
                        dann warte ich mal bis die letzte Beta gut verwendbar wird.

                        Kommentar


                          #13
                          Das ewige 'da muss ein Strichpunkt hin' oder 'doch nicht' hängt mir ehrlich gesagt zum Hals raus!
                          Strichpunkte sollten Kommandos trennen und das ohne zu berücksichtigen, ob danach ein Zeilenvorschub kommt oder nicht oder noch ein anderes Kommando!
                          (Genauso wie Kommentare keinen Strichpunkt brauchen sollten!)

                          Nach der reinen eibPC-Lehre muss man nämlich bei jedem Einfügen oder Umstellen oder Löschen von Zeilen die Strichpunkte wieder prüfen.
                          Ist IMHO einfach nur bescheiden und dass es besser geht beweisen die meisten Programmiersprachen.

                          Marc, den Copy&Paste im EibStudio annervt.
                          BR
                          Marc

                          Kommentar


                            #14
                            Zitat von enertegus Beitrag anzeigen
                            Ganz offiziell: Es steht eine einzelne Anweisung immer ohne ";"
                            2 Anweisungen oder mehr mit ";" wobei die letzte wieder keinen hat.
                            Das ist ja nur die halbe Miete:
                            1. Es steht eine Anweisung pro Zeile
                            2. Stehen mehr Anweisungen pro Zeile (Aneinanderreihung), werden diese durch Strichpunkt getrennt (N.B. die letzte Anweisung hat dann eigentlich keinen Strichpunkt, siehe Ausnahme)
                            3. Will man mehrere Anweisungen (die ja in einer Zeile stehen müssten) über mehrere Zeilen verteilen, muss man '\\' an das Zeilenende stellen (Überlange Zeile) oder den gesamten Bereich in geschweifte Klammern fassen (Blockbildung).
                            4. Ausnahme: Nur bei Aneinanderreihungen, überlangen Zeilen und Blockbildung darf auf das letzte Kommando ausnahmsweise doch einen Strichpunkt folgen.


                            Das es überhaupt geht, so "inkonsequent" wie nun (also optionales ; bei mehrere Anweisungen) war ein Featurewunsch.
                            Das Flehen wurde erhört, vielen Dank, jedoch nicht konsequent umgesetzt und bedeutet ständiges, stupides prüfen der Strichpunkte nachdem man den Quellcode mal wieder umgestellt hat.

                            Beispiele:
                            [highlight=epc]
                            TimeID=10
                            DateID=11
                            [/highlight]
                            geht

                            [highlight=epc]
                            TimeID=10;DateID=11
                            [/highlight]
                            geht

                            [highlight=epc]
                            TimeID=10; \\
                            DateID=11;
                            [/highlight]
                            geht (siehe Ausnahme!)


                            [highlight=epc]
                            TimeID=10;
                            DateID=11;
                            [/highlight]
                            geht nicht

                            Wenn ich also aus:
                            [highlight=epc]
                            if change( Zahl ) or systemstart() then {
                            Zahl_str = convert( Zahl, Zahl_str );
                            Zahl_len = size( Zahl_str );
                            if Zahl_len > 3u16 then {
                            Zahl_str = split( Zahl_str, 0u16, Zahl_len - 4u16 ) + $.$ + split( Zahl_str, Zahl_len - 3u16, Zahl_len - 1u16 )
                            } endif;
                            if Zahl_len > 6u16 then {
                            Zahl_str = split( Zahl_str, 0u16, Zahl_len - 7u16 ) + $.$ + split( Zahl_str, Zahl_len - 6u16, Zahl_len )
                            } endif;
                            if Zahl_len > 9u16 then {
                            Zahl_str = split( Zahl_str, 0u16, Zahl_len - 10u16 ) + $.$ + split( Zahl_str, Zahl_len - 9u16, Zahl_len + 1u16 )
                            } endif
                            } endif
                            [/highlight]

                            folgendes machen will (was dann allerdings Blödsinn ist):
                            [highlight=epc]
                            Zahl_str = convert( Zahl, Zahl_str );
                            Zahl_len = size( Zahl_str );
                            if Zahl_len > 3u16 then {
                            Zahl_str = split( Zahl_str, 0u16, Zahl_len - 4u16 ) + $.$ + split( Zahl_str, Zahl_len - 3u16, Zahl_len - 1u16 )
                            } endif;
                            if Zahl_len > 6u16 then {
                            Zahl_str = split( Zahl_str, 0u16, Zahl_len - 7u16 ) + $.$ + split( Zahl_str, Zahl_len - 6u16, Zahl_len )
                            } endif;
                            if Zahl_len > 9u16 then {
                            Zahl_str = split( Zahl_str, 0u16, Zahl_len - 10u16 ) + $.$ + split( Zahl_str, Zahl_len - 9u16, Zahl_len + 1u16 )
                            } endif
                            [/highlight]
                            darf ich Strichpunkte checken gehen, toll.
                            BR
                            Marc

                            Kommentar


                              #15
                              Zitat von saft6luck Beitrag anzeigen
                              darf ich Strichpunkte checken gehen, toll.
                              Ich versteh dein Post nicht ganz: Meinst Du: Der Strichpunkt sollte immer erlaubt sein, quasi als Ende-Markierung wie bei C?
                              offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
                              Enertex Produkte kaufen

                              Kommentar

                              Lädt...
                              X