Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.07.2019, 14:20   #1
Arturlem
Пользователь
 
Регистрация: 17.07.2019
Сообщений: 24
По умолчанию Сигналы

я написал программу для трех сигналов при трех состояниях (красный, желтый, зеленый). Допустим, я ставлю первый сигнал на "вкл", квадрат загорается красным цветом. Второй если ставлю - желтым, третий - зеленым.
Задача заключается в том, что у меня будут 30 сигналов при трех состояниях. 10 сигналов должны быть красными, 10-зелеными, 10 - желтыми. И должен быть приоритет сигналов, то есть у красных-высокий, потом желтый, потом -зеленый. Я поэтому так написал код. К примеру, если будут включены одновременно и красный и желтый, то будет гореть красный цвет.
Изображения
Тип файла: jpg 134.jpg (61.3 Кб, 140 просмотров)
Arturlem вне форума Ответить с цитированием
Старый 17.07.2019, 14:51   #2
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Arturlem
А где вопрос?
Почему код вставлен картинкой?

Цитата:
Сообщение от Arturlem Посмотреть сообщение
Задача заключается в том, что у меня будут 30 сигналов при трех состояниях. 10 сигналов должны быть красными, 10-зелеными, 10 - желтыми.
Сигналы независимые?

Если код повторяется более 3-х раз, то стоит использовать циклы. А в вашем случае ещё и массивы.


Цитата:
Сообщение от Arturlem Посмотреть сообщение
сигналов при трех состояниях (красный, желтый, зеленый).
Скорее всего говорить о состояниях не есть хорошо. У вас есть комбинаторная логика.

У вас есть функция которая получает сигналы на вход и решает какой цвет загорится. Вот в ней и прописываете свои приоритеты на логических операторах.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .

Последний раз редактировалось Pavia; 17.07.2019 в 15:01.
Pavia вне форума Ответить с цитированием
Старый 17.07.2019, 15:03   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

если a то красный // и без разницы b и c
иначе если b то желтый // и без разницы c
иначе если c то зеленый
иначе белый
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 17.07.2019, 15:22   #4
Arturlem
Пользователь
 
Регистрация: 17.07.2019
Сообщений: 24
По умолчанию

Цитата:
Сообщение от Pavia Посмотреть сообщение
Arturlem
А где вопрос?
Почему код вставлен картинкой?


Сигналы независимые?

Если код повторяется более 3-х раз, то стоит использовать циклы. А в вашем случае ещё и массивы.



Скорее всего говорить о состояниях не есть хорошо. У вас есть комбинаторная логика.

У вас есть функция которая получает сигналы на вход и решает какой цвет загорится. Вот в ней и прописываете свои приоритеты на логических операторах.


Да, для 30ти сигналов нужно использовать массив. Пробовал, но не очень-то получается все это, не загорается ничего.
Я это делаю в языке сценариев CTRL. Это практически как С.
Если нетрудно можете помочь разобраться в этом мне
Код:
main()
{
  EP_setBackColor();
}

void EP_setBackColor()
{
  dyn_errClass err;

  if( !dpExists( "System1:SP1.SP1:_online.._value") || !dpExists( "System1:SP2.SP2:_online.._value") || !dpExists( "System1:SP3.SP3:_online.._value"))
  {
    setValue("", "color", "black");
    return;
  }

  dpConnect("EP_setBackColorCB", "System1:SP1.SP1:_online.._value", "System1:SP2.SP2:_online.._value", "System1:SP3.SP3:_online.._value");

  err = getLastError();
  if (dynlen(err) > 0)
    setValue("", "color", "black");
}



void EP_setBackColorCB(string dpSource1, bool a, string dpSource2, bool b, string dpSource3, bool c)
{
  if (a == 1 && b == 1 && c == 1)
    setValue("", "backCol", "red");
  else if (a == 1 && b == 0 && c == 0)
    setValue("", "backCol", "red");
  else if (a == 1 && b == 0 && c == 1)
    setValue("", "backCol", "red");
  else if (a == 1 && b == 1 && c == 0)
    setValue("", "backCol", "red");
  else if (a == 0 && b == 1 && c == 0)
    setValue("", "backCol", "yellow");
  else if (a == 0 && b == 1 && c == 1)
    setValue("", "backCol", "yellow");
  else if (a == 0 && b == 0 && c == 1)
    setValue("", "backCol", "green");
  else 
    setValue("", "backCol", "white");
}
Arturlem вне форума Ответить с цитированием
Старый 17.07.2019, 15:24   #5
Arturlem
Пользователь
 
Регистрация: 17.07.2019
Сообщений: 24
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
если a то красный // и без разницы b и c
иначе если b то желтый // и без разницы c
иначе если c то зеленый
иначе белый
Я сделал это для трех сигналов, а надо для 30ти. Я же не буду все условия для трех событий перечислять. Поэтому мне нужна оптимизация какая-то
Arturlem вне форума Ответить с цитированием
Старый 17.07.2019, 15:26   #6
Arturlem
Пользователь
 
Регистрация: 17.07.2019
Сообщений: 24
По умолчанию

Да, сигналы независимые.
Arturlem вне форума Ответить с цитированием
Старый 17.07.2019, 15:29   #7
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,694
По умолчанию

Так вам же уже сказали и про массивы, и про циклы, и про сокращения условия. Какая вам еще оптимизация нужна? Откуда приходят сигналы? Как приходят? Как хранятся?
p51x на форуме Ответить с цитированием
Старый 17.07.2019, 15:38   #8
Arturlem
Пользователь
 
Регистрация: 17.07.2019
Сообщений: 24
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Так вам же уже сказали и про массивы, и про циклы, и про сокращения условия. Какая вам еще оптимизация нужна? Откуда приходят сигналы? Как приходят? Как хранятся?
Я пробовал, но не работает для 10 сигналов. Для трех, как я изначально выложил работает идеально. Сигналы булевские, то есть вкл/выкл. Сигналы у меня на симуляторе. Чтобы представление было, прикрепил картинку)
Код:
 main()
{
  EP_setBackColor();
}
  


void EP_setBackColor()
{
  dyn_errClass err;

       if( !dpExists( "System1:SP1.SP1:_online.._value") || !dpExists( "System1:SP2.SP2:_online.._value") || !dpExists( "System1:SP3.SP3:_online.._value") 
       || !dpExists( "System1:SP4.SP4:_online.._value") || !dpExists( "System1:SP5.SP5:_online.._value") || !dpExists( "System1:SP6.SP6:_online.._value") ||
       !dpExists( "System1:SP7.SP7:_online.._value")|| !dpExists( "System1:SP8.SP8:_online.._value")|| !dpExists( "System1:SP9.SP9:_online.._value") ||
       !dpExists( "System1:SP10.SP10:_online.._value"))
  {
  
    setValue("", "color", "black");
    return;
  }

  dpConnect("EP_setBackColorCB", "System1:SP1.SP1:_online.._value", "System1:SP2.SP2:_online.._value", "System1:SP3.SP3:_online.._value"
            , "System1:SP4.SP4:_online.._value", "System1:SP5.SP5:_online.._value", "System1:SP6.SP6:_online.._value", "System1:SP7.SP7:_online.._value"
            , "System1:SP8.SP8:_online.._value", "System1:SP9.SP9:_online.._value", "System1:SP10.SP10:_online.._value");

  err = getLastError();
  if (dynlen(err) > 0)
    setValue("", "color", "black");
}



void EP_setBackColorCB(string dpSource1, bool a, string dpSource2, bool b, string dpSource3, bool c)
{
   dyn_dyn_int dd_IntArray;
   dd_IntArray = makeDynInt(1,2,3,4,5,6,7,8,9,10);
   
 for (; i < 10; ++i)
    if (sdd_IntArray[i] == 1)
        break;
 
if (i < 4)
    setValue("", "backCol", "red");
else if (i < 7)
    setValue("", "backCol", "yellow");
else if (i < 10)
    setValue("", "backCol", "green");
else
    setValue("", "backCol", "white");

}
Изображения
Тип файла: png 14.PNG (24.4 Кб, 138 просмотров)
Arturlem вне форума Ответить с цитированием
Старый 17.07.2019, 16:10   #9
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,694
По умолчанию

1. Раз сигналы независимы и зависят от 3 входных, то либо EP_setBackColorCB должна вызываться для каждого отдельно с указанием номера, либо (судя по вашему коду) вы должны расширить кол-во ее параметров в 10 раз. Хотя лучше организовать массив параметров, если поддерживается.
2. dd_IntArray и sdd_IntArray это разные массивы или опечатки?
3. Зачем вы поменяли логику того, что вам говорили? Зачем вы создали массив номеров, ищете в нем 1 и крутите бессмысленное условие? Очевидно, что i там будет 0 или 10.
Почему у вас теперь цвет не зависит от входных сигналов?
p51x на форуме Ответить с цитированием
Старый 17.07.2019, 16:26   #10
Arturlem
Пользователь
 
Регистрация: 17.07.2019
Сообщений: 24
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
1. Раз сигналы независимы и зависят от 3 входных, то либо EP_setBackColorCB должна вызываться для каждого отдельно с указанием номера, либо (судя по вашему коду) вы должны расширить кол-во ее параметров в 10 раз. Хотя лучше организовать массив параметров, если поддерживается.
2. dd_IntArray и sdd_IntArray это разные массивы или опечатки?
3. Зачем вы поменяли логику того, что вам говорили? Зачем вы создали массив номеров, ищете в нем 1 и крутите бессмысленное условие? Очевидно, что i там будет 0 или 10.
Почему у вас теперь цвет не зависит от входных сигналов?
Цитата:
Сообщение от p51x Посмотреть сообщение
1. Раз сигналы независимы и зависят от 3 входных, то либо EP_setBackColorCB должна вызываться для каждого отдельно с указанием номера, либо (судя по вашему коду) вы должны расширить кол-во ее параметров в 10 раз. Хотя лучше организовать массив параметров, если поддерживается.
2. dd_IntArray и sdd_IntArray это разные массивы или опечатки?
3. Зачем вы поменяли логику того, что вам говорили? Зачем вы создали массив номеров, ищете в нем 1 и крутите бессмысленное условие? Очевидно, что i там будет 0 или 10.
Почему у вас теперь цвет не зависит от входных сигналов?

Я в первый раз столкнулся с этим, поэтому я на стадии разбирательства еще.
Там опечатка =)

Массив тут задается странным образов. Как в Си если задать, то выходит ошибка.
Так я задал, вроде хотя бы запускается, опять-таки, верно или нет, не знаю
Код:
 dyn_dyn_int dd_IntArray;
   dd_IntArray = makeDynInt(1,2,3,4,5,6,7,8,9,10);
Цвет, чтобы зависел от входных сигналов, мне надо просто использовать вместе i a,b,c?
Я пытался увеличить количество параметров в 10 раз, там тоже безуспешно
Arturlem вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сигналы из вне JohnSh C# (си шарп) 2 10.11.2016 21:38
QT - сигналы Базиля Помощь студентам 13 06.10.2013 19:39
Сигналы Yelisey Общие вопросы C/C++ 1 08.05.2011 17:54
сигналы в Qt! marselik Qt и кроссплатформенное программирование С/С++ 1 24.11.2010 23:29