Easyelectronics.ru

Электроника для всех
Текущее время: 29 сен 2020, 03:58

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/5шт. два слоя. $5/5шт. четыре слоя
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 14 ] 
Автор Сообщение
 Заголовок сообщения: цикл for с непростым оператором
СообщениеДобавлено: 28 мар 2016, 19:09 
Заглядывает иногда

Зарегистрирован: 03 янв 2016, 13:04
Сообщения: 80
Откуда: Казань, Набережные Челны
Доброго времени суток.
Сильно захотелось реализовать в тексте программы для микроконтроллера конструкцию
Код:
for (j=1; (n==1)|(!(k==0));
   if (!(j % 3 == 0))
      j++;
   else if (n==1)
      j++;
   else (j-=2)
)

Компилятор обработает корректно? Точек с запятой больно много внутри этого одного for. Я могу это попытаться проверить через отладку, но решил, что проще будет спросить сначала у специалистов.
CodeBlocks даже установил в порыве, но там gcc-компилятор не находится почему-то. А как его там указать, пока не разбирался. Не знаю, возможно ли там вообще это проверить.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: цикл for с непростым оператором
СообщениеДобавлено: 28 мар 2016, 19:25 
Старожил

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2795
Откуда: Санкт-Петербург
Взяли бы да попробовали, что спрашиваете?
Хотя мне понятно, что не сработает: там, где должно быть выражение - нельзя if. На крайняк можете заменить его на ?:
Но лучше так не писать - просто внесите всё, что после второй точки с запятой в конец тела цикла и не парьтесь. А for пусть выглядит как
Код:
for (j=1; (n==1)||(k!=0); ) {
   ...
   if (!(j % 3 == 0))
      j++;
   else if (n==1)
      j++;
   else (j-=2)
}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: цикл for с непростым оператором
СообщениеДобавлено: 28 мар 2016, 19:59 
Старожил

Зарегистрирован: 24 июн 2011, 14:05
Сообщения: 309
Откуда: Новочеркасск
А зачем for, если условие выхода их цикла for не по счётчику j, а по каким то другим условиям?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: цикл for с непростым оператором
СообщениеДобавлено: 28 мар 2016, 20:33 
Заглядывает иногда

Зарегистрирован: 03 янв 2016, 13:04
Сообщения: 80
Откуда: Казань, Набережные Челны
Спасибо за помощь. И правда, оператор надо попробовать внести в тело цикла. Хотя помню, что в Excel я вводил очень страшные логические выражения, и всё работало, как надо.
ELEKTROS, это не окончательный вариант конструкции. Но да, выход из цикла у меня будет не по j. Эдакий закольцованный цикл планируется. Просто у меня будет 100500 действий, которые похожи друг на друга. Вот и решил всё свернуть в один for. Посмотрим, что из этого выйдет.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: цикл for с непростым оператором
СообщениеДобавлено: 28 мар 2016, 21:31 
Старожил

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2795
Откуда: Санкт-Петербург
ELEKTROS, ну, выход не по счётчику - нормальное явление для си-шного for. Ублюдочный оператор, честно говоря: принципиально не отличается от while. В чуть более современных языках люди предпочитают вместо него что-нибудь типа foreach использовать.

VicSpectator, дык в ёкселе оператор if возвращает значение, насколько я помню (и, соответственно, его аналог - не if, а тернарная операция условие?значение1:значение2). И ещё в некоторых языках такое - в том же Хаскеле if вообще просто функция.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: цикл for с непростым оператором
СообщениеДобавлено: 29 мар 2016, 00:57 
Старожил

Зарегистрирован: 31 янв 2010, 20:19
Сообщения: 4946
Откуда: Донецк-Мариуполь
Насколько мне известно, в цикле for возможно только ДВЕ точки с запятой. Если требуется пара простых операторов в конце цикла, это делается через простую запятую.
if ( i=0; i<N; i++, j++ ).....


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 29 мар 2016, 11:26 
Старожил
Аватара пользователя

Зарегистрирован: 03 сен 2010, 22:46
Сообщения: 6095
Откуда: Москва
Такие конструкции возможны, синтаксис позволяет. Но это очень плохой стиль программирования, потому что компилятор из этого кода сделает чёрт знает что.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: цикл for с непростым оператором
СообщениеДобавлено: 29 мар 2016, 11:35 
Старожил

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2795
Откуда: Санкт-Петербург
Не, ну компилятор-то сделает известно что, но использование хитровыебанных конструкций - это нарушение основного правила: "пиши код так, как будто поддерживать его будет неуравновешенный религиозный маньяк, который знает, где ты живешь".


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: цикл for с непростым оператором
СообщениеДобавлено: 29 мар 2016, 11:40 
Старожил
Аватара пользователя

Зарегистрирован: 03 сен 2010, 22:46
Сообщения: 6095
Откуда: Москва
И это тоже.

В любом случае лучше избегать использования подобных конструкций, это плохая практика. Особенно на C.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: цикл for с непростым оператором
СообщениеДобавлено: 01 май 2016, 02:59 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 05 сен 2012, 12:00
Сообщения: 138
Откуда: МО, Солнечногорск
например, вот это:
Код:
uint32_t Med(uint8_t Size) //медианный фильтр
{
static uint32_t gap, i, j, temp;


   for (gap = Size/2; gap > 0; gap /= 2)
         for (i = gap; i < Size; i++)
             for (j = i - gap; j >= 0 && TimeW[j] > TimeW[j + gap]; j -= gap)
             {
                 temp = TimeW[j];
                 TimeW[j] = TimeW[j + gap];
                 TimeW[j + gap] = temp;
             }




return TimeW[Size>>1];


точно работает в ARM-GCC. TimeW в данном случае глобальный массив, Size его размер

_________________
Даже если сложить в одну кучу поле капусты, все равно коллективного разума не получится.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: цикл for с непростым оператором
СообщениеДобавлено: 01 май 2016, 09:38 
Старожил

Зарегистрирован: 06 фев 2011, 15:16
Сообщения: 618
Откуда: Челябинск
madmazy писал(а):
например, вот это:
Код:
uint32_t Med(uint8_t Size) //медианный фильтр
{
static uint32_t gap, i, j, temp;

   for (gap = Size/2; gap > 0; gap /= 2)
         for (i = gap; i < Size; i++)
             for (j = i - gap; j >= 0 && TimeW[j] > TimeW[j + gap]; j -= gap)
             {
                 temp = TimeW[j];
                 TimeW[j] = TimeW[j + gap];
                 TimeW[j + gap] = temp;
             }

return TimeW[Size>>1];


точно работает в ARM-GCC. TimeW в данном случае глобальный массив, Size его размер

Работает-то оно работает. Только выражение j>=0 есть всегда "истина" и, стало быть, его можно убрать. Что компилятор, видимо, и делает. Зачем усложнять программы, когда они и без того сложные?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: цикл for с непростым оператором
СообщениеДобавлено: 01 май 2016, 10:26 
Старожил
Аватара пользователя

Зарегистрирован: 24 июл 2012, 13:54
Сообщения: 856
Небольшой хак про количество точек с запятой:

Код:
for(int i = 0, b = 1; b ;
   ({
      i++;
      std::cout << i;
      std::cout << std::endl;
      if (i == 8) b = 0;
   })) std::cout << "HelloWorld";

Для написания всяческих макросов полезно бывает :).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: цикл for с непростым оператором
СообщениеДобавлено: 01 май 2016, 10:42 
Старожил
Аватара пользователя

Зарегистрирован: 24 июл 2012, 13:54
Сообщения: 856
А можно вообще вот так писать:

Код:
for(int i = 0, b = 1;
   b =
   ({
      i++; i < 8 ? 1 : 0;
   })
   ;)
   std::cout << "HelloWorld\r\n";


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: цикл for с непростым оператором
СообщениеДобавлено: 02 май 2016, 03:34 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 05 сен 2012, 12:00
Сообщения: 138
Откуда: МО, Солнечногорск
Mirmik, спасибо за открытие глаз

ибо нехрен мне было бездумно заниматься копипиздингом в 3 часа ночи и тупо исправлять int на uint32_t
код брал из Педивикии (https://ru.wikipedia.org/wiki/Сортировка_Шелла )и стормозил при исправлении типов, что uint -то всегда положительный... проверил что работает - и ладно:(
не надо так (с)

_________________
Даже если сложить в одну кучу поле капусты, все равно коллективного разума не получится.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 14 ] 


Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB