Как правильно написать цикл for для обратного отсчета?

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

sadman41 пишет:
церковная десятина нарисуется...

Изучите пожалуйста внимательно - http://diy.lilitko.ru/reviews/CoverMonastery.htm

Мне и DetSimen особенно пункт 7 понравился. Хорошие налоги святые сёстры установили :)

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

qwone пишет:

Ну про вывод в офшоры

Это про Интерконнект?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

qwone пишет:

У больших компьютеров память для программ и память для переменных это одно большое ОЗУ.

Если все компьютеры с фон-Неймановской архитектурой относить к большим, то среди последних окажутся также ZX-Spectrum, Радио РК-86 и даже Altair 8800 с 256 байтами ОЗУ.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

ЕвгенийП пишет:

5N62V пишет:

#if (SIZE<256)
       for( unsigned char i = 0; i<SIZE; i++) 
#elif  (SIZE>256 && SIZE< 65535)
       for( unsigned int i = 0; i<SIZE; i++)
#else
       for( unsigned long i = 0; i<SIZE; i++)
#endif
{.............}

Мне это кажется паранойей.

А мне это кажется вопиющим игнорирование случая SIZE==256.

5N62V
Offline
Зарегистрирован: 25.02.2016

andriano пишет:

А мне это кажется вопиющим игнорирование случая SIZE==256.

Вы отчасти правы! Отчасти, потому как все равно код остается рабочим, а следовательно к вопиющим случаям не относится!  ;Р

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

andriano пишет:

ЕвгенийП пишет:

Мне это кажется паранойей.

А мне это кажется вопиющим игнорирование случая SIZE==256.

Одно другому не мешает.

sadman41
Онлайн
Зарегистрирован: 19.10.2016

ЕвгенийП пишет:

sadman41 пишет:

Но компилятор действительно бормочет:

sketch_feb03a.ino:5:26: warning: comparison is always true 

Во-во. И цикл становится бесконечным. А в IDE по умолчанию предупреждения подавлены, чтобы не пугать лохов, так что это может стать серьёзной проблемой.

Так какой пример, по Вашему мнению, показателен для такого случая? Мои два цикла что с i<SIZE , что i<=SIZE-1 мотают одинаково - с переполнением и заходом на новый круг. 

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

Ну, может и не показателен.. Я хотел идею объяснить про типовость и бестиповость, а пример, возможно, и неудачный второпях придумал. 

ELITE
ELITE аватар
Offline
Зарегистрирован: 11.01.2018

да уж - 2 страницы флуда на такой простой вопрос...

вы еще забыли вариант инвертирования внутри цикла ) а это тоже бывает удобно, когда надо сразу и в + и в - считать

for (int i=0; i <= 5; i++){

 println(5-i);

}

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

5N62V пишет:

andriano пишет:

А мне это кажется вопиющим игнорирование случая SIZE==256.

Вы отчасти правы! Отчасти, потому как все равно код остается рабочим, а следовательно к вопиющим случаям не относится!  ;Р

Т.е. полное отсутствие цикла экврвалентно его 256 проходам?

5N62V
Offline
Зарегистрирован: 25.02.2016

andriano пишет:

Т.е. полное отсутствие цикла экврвалентно его 256 проходам?

Извините, я не понял этот чудесный набор слов. Где отсутствие цикла? Ну х с ним, #define SIZE 256, ну не выполнится первое условие, ну не выполнится второе , но выполнится #else, и переменная i будет объявлена unsigned long. Не оптимально? - Да. не оптимально. Код рабочий? - да, код рабочий.  ;)

Но правильно было бы записать, конечно

#elif  (SIZE>=256 && SIZE< 65535)

тут спорить не о чем, Ваше первое замечание абсолютно резонное.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

ELITE.Радуйтесь, что не затронули вопрос как в цикле писать ++i, i++ или же i =+1 ;) 

Хотя такой вариант еще хуже  for (int i = 0; ++i <= 5;)

5N62V
Offline
Зарегистрирован: 25.02.2016

qwone пишет:

ELITE.Радуйтесь, что не затронули вопрос как в цикле писать ++i, i++ или же i =+1 ;) 

Хотя такой вариант еще хуже  for (int i = 0; ++i <= 5;)

Да нафиг тот for?

uint8_t i= 0;
while(++i<=SIZE){       ;}

Эмммм..... не, не кошерно. Так более лучшее для индексации массивов:

uint8_t i = 0; 
while(i++<SIZE){.......}

 

arduinec
Offline
Зарегистрирован: 01.09.2015

5N62V пишет:

Дабы не плодить тем, напишу тут.

Читаю Харви и Пола Дейтел "Как программировать на С".  Все примеры они пишут типа :

#define SIZE 10

for(i = 0; i<=SIZE-1; i++){........}

Почему именно так: <=SIZE-1? А то я всю дорогу пишу <SIZE, но уже , блин, не один раз обжегся на том, что вроде бы очевидные для меня вещи на самом деле оказываются не тем, что я о них представлял. :)

Скорее всего авторы страхуются от ситуации когда SIZE не определён, то есть в коде стоит:

#define SIZE
ELITE
ELITE аватар
Offline
Зарегистрирован: 11.01.2018

qwone пишет:

ELITE.Радуйтесь, что не затронули вопрос как в цикле писать ++i, i++ или же i =+1 ;) 

Хотя такой вариант еще хуже  for (int i = 0; ++i <= 5;)

хуже? очень спорно... если четко понимать отличия между i++ и ++i то это очень даже полезно бывает )

орсобено если надо выйти за рамки цикла без дополнительных вычислений или если использовать цикл where 

sadman41
Онлайн
Зарегистрирован: 19.10.2016
uint8_t i = SIZE;
while(i--){.......}

 

5N62V
Offline
Зарегистрирован: 25.02.2016

sadman41 пишет:

uint8_t i = SIZE;
while(i--){.......}

 

Так вроде бы хужее, так как для индексации надо в этом случае [i-1] использовать. Получится число лишних опреаций  = SIZE, как минимум.

sadman41
Онлайн
Зарегистрирован: 19.10.2016

Для чего нужен цикл - не написано. В нем может быть и инкремент указателя.