Wenn dies dein erster Besuch hier ist, lies bitte zuerst die Hilfe - Häufig gestellte Fragen durch. Du musst dich vermutlich registrieren, bevor du Beiträge verfassen kannst. Klicke oben auf 'Registrieren', um den Registrierungsprozess zu starten. Du kannst auch jetzt schon Beiträge lesen. Suche dir einfach das Forum aus, das dich am meisten interessiert.
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!
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
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
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".
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!
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.
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).
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.
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:
Es steht eine Anweisung pro Zeile
Stehen mehr Anweisungen pro Zeile (Aneinanderreihung), werden diese durch Strichpunkt getrennt (N.B. die letzte Anweisung hat dann eigentlich keinen Strichpunkt, siehe Ausnahme)
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).
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]
Wir verarbeiten personenbezogene Daten über die Nutzer unserer Website mithilfe von Cookies und anderen Technologien, um unsere Dienste bereitzustellen. Weitere Informationen findest Du in unserer Datenschutzerklärung.
Indem Du unten auf "ICH stimme zu" klickst, stimmst Du unserer Datenschutzerklärung und unseren persönlichen Datenverarbeitungs- und Cookie-Praktiken zu, wie darin beschrieben. Du erkennst außerdem an, dass dieses Forum möglicherweise außerhalb Deines Landes gehostet wird und bist damit einverstanden, dass Deine Daten in dem Land, in dem dieses Forum gehostet wird, gesammelt, gespeichert und verarbeitet werden.
Kommentar