Ankündigung

Einklappen
Keine Ankündigung bisher.

if -> mehrere Anweisungen

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

  • saft6luck
    antwortet
    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.

    Einen Kommentar schreiben:


  • saft6luck
    antwortet
    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.

    Einen Kommentar schreiben:


  • MarkusL
    antwortet
    Michael, Danke für die Klarstellung.
    dann warte ich mal bis die letzte Beta gut verwendbar wird.

    Einen Kommentar schreiben:


  • enertegus
    antwortet
    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).

    Einen Kommentar schreiben:


  • MarkusL
    antwortet
    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.

    Einen Kommentar schreiben:


  • rb84
    antwortet
    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...

    Einen Kommentar schreiben:


  • MarkusL
    antwortet
    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.

    Einen Kommentar schreiben:


  • rb84
    antwortet
    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...

    Einen Kommentar schreiben:


  • MarkusL
    antwortet
    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!

    Einen Kommentar schreiben:


  • enertegus
    antwortet
    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

    Einen Kommentar schreiben:


  • Jukom
    antwortet
    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

    Einen Kommentar schreiben:


  • rb84
    antwortet
    Danke, so funktioniert es

    Einen Kommentar schreiben:


  • bmx
    antwortet
    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

    Einen Kommentar schreiben:


  • rb84
    hat ein Thema erstellt [EibParser] if -> mehrere Anweisungen.

    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.?
Lädt...
X