SCL-Compiler und Case-Anweisung

herdi

Level-1
Beiträge
50
Reaktionspunkte
4
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi miteinander,

was auch cool ist:

case x of

1: xxx;

2: yyy;

2: zzz;

end_case;

Der Compiler schnallt nicht dass es die 2 doppelt gibt. Er übersetzt ohne mucks und zur Laufzeit wird halt der erste Eintrag ausgeführt...


Gruß

Herdi
 
... daran kann ich nichts böses erkennen. Das ist (für mich) die Spielregel des CASE-Befehls. Wenn man das nicht haben möchte, dann gäbe es ja immer noch die Möglichkeit mit IF..THEN zu arbeiten.

Gruß
LL
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also (für mich) ist das durchaus als Fehler zu sehen.

Die Fälle der CASE-Anweisung sollten ja eindeutig sein und ein mehrfaches verwenden eines Falles eindeutig ein Programmierfehler der aber definitv vom Compiler erkannt werden müsste.

Zumindest alles was mir compilermässig momentan zur Hand ist (Borland C++, Codesys, B&R) lässt sowas nicht durchgehen. Außer der S7-SCL-Compiler...
 
Zuletzt bearbeitet:
herdi hat es schon gesagt, aber da ich es schon getippt habe:

Zumindest bei Delphi setzt es in diesem Fall einen Fehler, und das
zu Recht, denn es handelt sich ja um Konstanten, die als Sprunglabels
dienen. (zwei Labels mit gleichem Namen halt).

Und mit der IF...THEN-Konstruktion hat der Programmierer dieselbe
Fehlermöglichkeit, nur der Compiler darf hier überhaupt nicht meckern.
 
CASE-Anweisung sollten ja eindeutig sein...

Der SCL Compiler lehnt sich in seinem Verhalten an das in der IEC 61131-3 Norm für die Sprache ST beschriebene Verhalten an. Dort steht, dass die Anweisungen, die nach dem ersten gefundenen, passenden CASE-Label stehen, ausgeführt werden. Kein Fehler soll/muß ausgegeben werden. Bei einem Beispiel, wie:

case i of
case 2: ...;
...;
case 10..18: ...;
case 0..100: ...;
...;
end_case;

wäre es auch nicht sinnvoll, um noch weitere Spezialfälle einzufügen, jedesmal die Zeile case 0..100 auch abzuändern. Andere Sprachen verhalten sich da anders, aber so ist das mit anderen Sprachen.
 
Zurück
Oben