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_TYPE

Programm MAIN:

PROGRAM MAIN
VAR
    nVar   : INT;
    eColor : E_Color;
END_VAR
eColor := E_Color.eGreen;                           // no error
eColor := E_Color.eGreen + 1;                       // => SA0058
nVar   := E_Color.eBlue / 2;                        // => SA0058
nVar   := E_Color.eGreen + E_Color.eRed;            // => SA0058

Beispiel 2:

Enumeration E_State mit Attribut 'flags':

{attribute 'flags'}
TYPE E_State :
(
    eUnknown := 16#00000001,
    eStopped := 16#00000002,
    eRunning := 16#00000004
) DWORD;
END_TYPE

Programm MAIN:

PROGRAM MAIN
VAR
    nFlags : DWORD;
    nState : DWORD;
END_VAR
IF (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