Как избежать литералов в метках case в CCW с использованием структурированного текста?

Я использую Connected Components Workbench (CCW), и синтаксис оператора case, приведенного в документации, следующий:

CASE <integer_expression> OF
    <value> : <statement1> ;
              <statement2> ;
              <statementsN>

<value> : <statements> ;

<value>, <value> : <statements>;
...
ELSE
<statements> ;
END_CASE;

Я бы не хотел использовать явные числа (литералы):

CASE STATE OF
STATE_A:
    // Some code
STATE_B:
    // Some code
ELSE
END_CASE;

Когда я использую переменные для меток case, я получаю ошибку компиляции:

Error 1 STATE_A:unexpected statement

Есть ли способ избежать явных чисел для разных случаев?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
483
1

Ответы 1

Один из вариантов - использовать вместо этого перечисления. Сначала вам нужно определить перечисление как тип. Это перечисление, в свою очередь, может быть любым примитивным типом данных, который вам нужен. Если вы добавите прагму «qual_only», вы можете сделать код более элегантным. Скажем, например, вы определяете новый тип как:

{attribute 'qualified_only'}
TYPE E_State :
(
    A := 0,
    B := 1,
    C := 2
) USINT;
END_TYPE

В основном вы говорите, что это перечисление, которое займет 1 байт пространства (поскольку базовым типом является USINT), и что если вы хотите использовать перечисление, ему должно предшествовать имя перечисление (в данном случае "E_State"). Обратите внимание, что вам не нужно явно указывать здесь числа. Если вы не пишете никаких чисел, компилятор автоматически примет первое значение нуля и прибавит по единице к каждому последующему. Так что это тоже сработает:

{attribute 'qualified_only'}
TYPE E_State :
(
    A,
    B,
    C
) USINT;
END_TYPE

Вам даже не нужно объявлять базовый тип. Если вы ничего не объявляете (поэтому не пишете USINT выше), компилятор автоматически примет это INT.

Использование этого в случае переключателя в программе или функциональном блоке могло бы сделать это так:

PROGRAM MAIN
VAR
    eState : E_State;
END_VAR

Тело:

CASE eState OF
    E_State.A : 
        // Do something A
    E_State.B : 
        // Do something B
    E_State.C : 
        // Do something C
    ELSE
        // Do something
END_CASE

Вы также можете удалить {attribute 'qualified_only'} из определения перечисления. Таким образом можно забыть префикс E_State и использовать значения A, B, C .. вместо E_State.A.

Quirzo 02.05.2018 07:37

Другие вопросы по теме