Skip to main content

SA0058 : Opérations sur les variables d'énumération

Détecte les opérations sur les variables du type de données d'énumération. Les affectations sont autorisées.

Justification : Les énumérations ne doivent pas être utilisées comme des valeurs entières ordinaires. Alternativement, un type de données alias pourrait être défini ou un type de sous-plage pourrait être utilisé.

Importance : Moyenne

Exception : si une énumération est taguée avec le pragma {attribute 'strict'}, le compilateur signale déjà ce type d'opération.

Si une énumération est déclarée comme flag par le pragma {attribute 'flags'}, aucune erreur n'est émise pour AND, OR, NOT, ou sur commande XOR opérations.

Exemple 68. Exemple
TYPE My_Enum :
(
    red := 1, blue := 2, green := 3, black := 4
);
END_TYPE
PROGRAM PLC_PRG
VAR
    iTemp1 : INT;
    abc : My_Enum;
END_VAR
iTemp1 := iTemp1 + INT#1;
abc := My_Enum.red;    // OK
iTemp1 := My_Enum.black / My_Enum.blue;    //  SA0058
iTemp1 := My_Enum.green / My_Enum.red;    //  SA0058

Sortie dans le messages voir:

  • sa_icon_message.png SA0058 : Opérations sur les variables d'énumération



Exemple 69. Exemple avec un pragma {attribut 'flags'}
{attribute 'flags'}  // declaring the enumeration as a "flag"
TYPE Flags :
(
    Unknown := 16#00000001,
    Stopped := 16#00000002,
    Running := 16#00000004
) DWORD;
END_TYPE
PROGRAM PLC_PRG
VAR
 iTemp1 : INT;
 abc : Flags;
        batate : BYTE;
        dwFlags : DWORD;
        dwState : DWORD;
END_VAR
// OK for the following
IF (dwFlags AND Flags.Unknown) <> DWORD#0 THEN
        dwState := dwState AND Flags.Unknown;
    ELSIF (dwFlags OR Flags.Stopped) <> DWORD#0 THEN
        dwState := dwState OR Flags.Running;
END_IF