SA0058: Operation auf Enumerationsvariablen
Funktion | Ermittelt Operationen auf Variablen vom Typ einer Enumeration. Zuweisungen sind erlaubt. |
Begründung | Enumerationen sollten nicht als normale Integer-Werte verwendet werden. Alternativ kann ein Alias-Datentyp definiert oder ein Unterbereichstyp verwendet werden. |
Ausnahme | Wenn eine Enumeration mit dem Attribut {attribute 'strict'} gekennzeichnet ist, dann meldet bereits der Compiler eine solche Operation. Wenn eine Enumeration mit Hilfe des Pragmaattributs {attribute 'flags'} als Flag deklariert ist, wird für Operationen mit AND, OR, NOT, XOR kein Fehler SA0058 ausgegeben. |
Wichtigkeit | Mittel |
Beispiel 1:
Enumeration E_Color:
TYPE E_Color :
(
eRed := 1,
eBlue := 2,
eGreen := 3
);
END_TYPEProgramm MAIN:
PROGRAM MAIN
VAR
nVar : INT;
eColor : E_Color;
END_VAReColor := E_Color.eGreen; // no error
eColor := E_Color.eGreen + 1; // => SA0058
nVar := E_Color.eBlue / 2; // => SA0058
nVar := E_Color.eGreen + E_Color.eRed; // => SA0058Beispiel 2:
Enumeration E_State mit Attribut 'flags':
{attribute 'flags'}
TYPE E_State :
(
eUnknown := 16#00000001,
eStopped := 16#00000002,
eRunning := 16#00000004
) DWORD;
END_TYPEProgramm MAIN:
PROGRAM MAIN
VAR
nFlags : DWORD;
nState : DWORD;
END_VARIF (nFlags AND E_State.eUnknown) <> DWORD#0 THEN // no error
nState := nState AND E_State.eUnknown; // no error
ELSIF (nFlags OR E_State.eStopped) <> DWORD#0 THEN // no error
nState := nState OR E_State.eRunning; // no error
END_IF