реклама на сайте
подробности

 
 
5 страниц V  « < 2 3 4 5 >  
Reply to this topicStart new topic
> Передача параметров в функцию., AVR-GCC/ATMega2560
sergeeff
сообщение Aug 21 2011, 20:31
Сообщение #46


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Цитата(ReAl @ Aug 21 2011, 20:04) *
Код
for(;;) {
   // endless loop
}
Совсем-совсем формально, возможно, и не отличается от while(1) {} (по стандарту для for(;;) «An omitted expression-2 is replaced by a nonzero constant»), но в качестве примера бесконечного цикла в C99 приведён именно этот вариант. В более ранних книгах тоже.
Не помню, чтобы я когда-либо писал while(1) :-)
Думаю, это рецидив паскаля :-)

Ни в каких компиляторах for(;;) никогда не оставляло хвостов недооптимизации в духе того, что бывало от while(1), например
Код
  jmp cy_end
cy_start:
   ...
cy_end:
; типа оптимизировали и пред-проверку поставили в конце, чтобы уменьшить число переходов
; потом увидели, что условие константа и проверку убрали
; но убрать jmp cy_end в начале забыли
  jmp cy_start


Для чего обычно пользуем while(1)? Ну вроде как основная (теневая) задача крутится. Сиречь нечто, не слишком критичное по времени. Ну и зачем там борьба за возможную лишнюю команду? Возможную, так это дело качества компилятора.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 21 2011, 23:03
Сообщение #47


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (sergeeff @ Aug 21 2011, 23:31) *
Ну и зачем....

Я уже писал - как минимум это вопрос просто грамотности.
Кроме того, вечные циклы используются не только в одном единственном случае sm.gif. Задача как правило не одна, и вечные циклы с continue/break тоже совершенно обыденное дело.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
777777
сообщение Aug 22 2011, 04:25
Сообщение #48


Профессионал
*****

Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357



Цитата(zltigo @ Aug 22 2011, 03:03) *
Я уже писал - как минимум это вопрос просто грамотности.

Понятно - лично вам такое не нравится.

Вообще-то никакие компиляторы давно не выдают предупреждений в подобных случаях. Во-первых, есть системы автоматической генерации кода, например для инициализайии периферии - пользователь ставит флажки в нужных местах, а система генерирует соответствующие #define-ы. Затем они используются в коде примерно таки м образом:
Код
  if (__TIMER_USED & 0x01) {                                // TIM1 used
    ...
    }
  if (__TIMER_USED & 0x02) {                                // TIM2 used
    ...
    }

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


Цитата(sergeeff @ Aug 22 2011, 00:31) *
Для чего обычно пользуем while(1)? Ну вроде как основная (теневая) задача крутится. Сиречь нечто, не слишком критичное по времени. Ну и зачем там борьба за возможную лишнюю команду? Возможную, так это дело качества компилятора.

Тем более что эта команда стоит после цикла и никогда не будет выполнена.
Go to the top of the page
 
+Quote Post
ARV
сообщение Aug 22 2011, 05:23
Сообщение #49


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



Цитата(zltigo @ Aug 22 2011, 02:03) *
Я уже писал - как минимум это вопрос просто грамотности.


лично мне кажется, что в данном вопросе while(1) vs for(;;) мы становимся заложниками того, что нам поведал гуру, и тот факт, что гуру мог быть в тот миг пьян, не в духе или просто не придал значения своим словам, даже не приходит нам в голову. я о знаменитых К&R. смотрите сами: while без выражения в скобках (т .е. с пустым местом) не может быть, в то же время в for второй операнд может быть пустым местом, причем, что самое странное, это пустое место воспринимается как истинное логическое выражение. налицо странные противоречия с логикой здравого смысла, возведенные в ранг закона: 1 - это значение логической истины, в то же самое время НИЧЕГО (пустое место), что мы привыкли отождествлять с НУЛЕМ, вдруг оказывается ИСТИНОЙ в другом операторе... мне кажется, что единожды признав, что А==B, надо впоследствии всегда придерживаться этого, а не менять на противоположное утверждение в зависимости от условий. то есть, сказав, что отсутствие операнда логического отношения приравнивается к ненулевому значению, следовало бы в стандарте допустить while() как пример бесконечного цикла, разрешить if() или switch() без операнда в скобках, а так же признать безошибочной запись а = ? 1 : 0;. а получается, что стандартизировали путаницу в понятиях.

с точки зрения здравого смысла оператор for(;;) куда более неграмотное выражение, нежели while(1) - по крайней мере последний здравому смыслу не противоречит.


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
777777
сообщение Aug 22 2011, 05:59
Сообщение #50


Профессионал
*****

Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357



Цитата(ARV @ Aug 22 2011, 09:23) *
лично мне кажется, что в данном вопросе while(1) vs for(;;) мы становимся заложниками того, что нам поведал гуру, и тот факт, что гуру мог быть в тот миг пьян, не в духе или просто не придал значения своим словам, даже не приходит нам в голову. я о знаменитых К&R.
смотрите сами: while без выражения в скобках (т .е. с пустым местом) не может быть, в то же время в for второй операнд может быть пустым местом, причем, что самое странное, это пустое место воспринимается как истинное логическое выражение. налицо странные противоречия с логикой здравого смысла

Они объясняли это тем, что for(;;) напоминает слово forever - навсегда, намекая на то, что это бесконечный цикл. Таким образом лингвистические соображения взяли верх над логическими.

Цитата(ARV @ Aug 22 2011, 09:23) *
с точки зрения здравого смысла оператор for(;;) куда более неграмотное выражение, нежели while(1) - по крайней мере последний здравому смыслу не противоречит.

+100
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 22 2011, 08:29
Сообщение #51


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (777777 @ Aug 22 2011, 07:25) *
Вообще-то никакие компиляторы давно не выдают предупреждений в подобных случаях.

К счастью, не все комппиляторописатели сдаются перед малограмотной толпой sm.gif.
Вот, например, IAR:
QUOTE
D:WORK_ARMXADDMAINmain.c(440) : Remark[Pe236]: controlling expression is constant

Отключаемо, как и любые warnings/remarks но таки есть.



QUOTE (ARV @ Aug 22 2011, 08:23) *
while(1) - по крайней мере последний здравому смыслу не противоречит.

Совершенно дикий у Вас "здравый смысл" - написать зачем-то бессмысленное выражение "пока белый цвет белого цвета", после чего ожидать, что компилятором оно будет похерено и получится то, что естественно пишется как for( ; ; ) - выполнять нечто без контроля каких-либо условий.

QUOTE (ARV @ Aug 22 2011, 08:23) *
в то же время в for второй операнд может быть пустым местом, причем, что самое странное, это пустое место воспринимается как истинное логическое выражение.

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


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Aug 22 2011, 08:35
Сообщение #52


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Цитата(zltigo @ Aug 22 2011, 11:18) *
К счастью, не все комппиляторописатели сдаются перед малограмотной толпой sm.gif.


Что-то вы больно резковаты в выражениях. В конце концов, что такое программа? Инструкции процессору сделать то, что ВЫ от него хотите. Он это делает, хоть
1. while(1)
2. for(;;;)
3. label1:
...
goto label1;

Какая половая разница? Это напоминает религиозные войны против goto. А что, сколь нибудь значительные по длине циклы while и for в конце концов обходятся без команд переходов на уровне команд процессора?
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 22 2011, 08:43
Сообщение #53


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (sergeeff @ Aug 22 2011, 11:35) *
Какая половая разница?

Что положить в чай сахар, что покласть, что набухать, чаю будет скорее всего все равно sad.gif. Но втрое пока? еще большинству еще режет слух.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
777777
сообщение Aug 22 2011, 09:15
Сообщение #54


Профессионал
*****

Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357



Цитата(zltigo @ Aug 22 2011, 12:29) *
Совершенно дикий у Вас "здравый смысл" - написать зачем-то бессмысленное выражение "пока белый цвет белого цвета"

Что ж тут дикого? Аргументом оператора while является логическая переменная, она здесь присутствует и не равна нулю.
Цитата(zltigo @ Aug 22 2011, 12:29) *
естественно пишется как for( ; ; ) - выполнять нечто без контроля каких-либо условий.

А чему равно значение логической переменной при ее отсутствии? sm.gif Тут приходится записывать в стандарт костыль, явно утверждающий, что в данной констрокции (и только в ней и никакой больше) отсутствие переменной должно трактоваться как ее истинное значение, а в других случаях как ошибка. Или вы будете спорить с тем, что это костыль?
Цитата(zltigo @ Aug 22 2011, 12:29) *
Отсутствие таблички на скамейке в парке об ограничении является естественным указанием на то, что сидеть можно. Табличка на зеленой скамейке - сидеть можно пока скамейка зеленая, просто идиотская.

Но мы же не о скамейке говорим, а о языке программирования.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 22 2011, 09:32
Сообщение #55


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (777777 @ Aug 22 2011, 12:15) *
Что ж тут дикого? Аргументом оператора while является логическая переменная, она здесь присутствует и не равна нулю.
скамейке говорим, а о языке программирования.

Неправильное, то, что тут присутствует КОНСТАНТА, а не, как Вы сами-же и написали, переменная или выражение. На эту, и вообще все, неправильности компилятору следует реагировать, как на места возможной ошибки программиста, или не полного понимания того, что программист хотел от компилятора.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Aug 22 2011, 10:04
Сообщение #56


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Меня критикуют за цитаты из книг. Тем не менее. Герберт Шилдт "Полный справочник по С" 4-изд. Стр.98:

"while(условие) оператор;
..

Условие(управляющее выражение) может быть любым допустимым в языке выражением. Условие считается истинным, если значение выражения не равно нулю, а оператор выполняется, если условие принимает значение ИСТИНА."

Константа "1" не равна нулю и является допустимым в языке С выражением.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 22 2011, 10:17
Сообщение #57


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (sergeeff @ Aug 22 2011, 13:04) *
является допустимым в языке С выражением.

Именно по причине того, что это написано в стандарте ("Полные Справочники" я игнорирую sm.gif ), я не говорю о том, что компилятор должен генерировать ошибку, только предупреждение о странном выражении в данном контексте.
А допустимых, но бессмысленных выражений написать можно массу, навскидку:
a = a;
b == a;
a; (это в случае, если "a" не volatile)


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
ARV
сообщение Aug 22 2011, 12:42
Сообщение #58


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



Цитата(zltigo @ Aug 22 2011, 11:29) *
Воспринимается, как отсутствие каких либо условий для продолжения выполнения цикла.
вот вы сами себя и подловили sm.gif : логика - штука железная. итак, провожу разбор вашего же утверждения: отсутствие условий для продолжения означает буквально не надо ничего делать, т.е. цикл должен бы быть не бесконечным, а пустым. ведь в цикле for второй операнд - именно условие ПРОДОЛЖЕНИЯ, а не прекращения цикла. было бы там условие прекращения - тогда ваше утверждение не вступало бы в противоречие со здравым смыслом: нет условий для завершения цикла - значит, цикл вечный.


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 22 2011, 12:53
Сообщение #59


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (ARV @ Aug 22 2011, 15:42) *
разбор вашего же утверждения: отсутствие условий для продолжения означает буквально не надо ничего делать

Отсутствие условий для продолжения означает, что цикл выполняется БЕЗ всяких условий - безусловно.
http://www.classes.ru/all-russian/russian-...v-term-2249.htm
Я русский язык, поскольку учился с 6 класса в русской школе, причем очень хорошей русской школе "за бугром", знаю достаточно прилично.
Точно так-же я знаю 'C' и не надо пытаться убеждать меня начинать писать на нем безграмотно. Все.



--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
ARV
сообщение Aug 22 2011, 13:32
Сообщение #60


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



Цитата(zltigo @ Aug 22 2011, 15:53) *
Отсутствие условий для продолжения означает, что цикл выполняется БЕЗ всяких условий - безусловно.
http://www.classes.ru/all-russian/russian-...v-term-2249.htm
Я русский язык, поскольку учился с 6 класса в русской школе, причем очень хорошей русской школе "за бугром", знаю достаточно прилично.
Точно так-же я знаю 'C' и не надо пытаться убеждать меня начинать писать на нем безграмотно. Все.
я не сомневаюсь, что вы знаете Си на пять с плюсом. я не спорю с тем, что закреплено в стандарте Си. я не спорю с необходимостью соблюдать стандарт. я признаю, что соблюдение правил и есть "грамотность".

я лишь пытаюсь заострить ваше внимание на том, что это нелогично. безусловный - не то же самое, что отсутствие условия. пример: условием для продолжения плавания под водой [более 5 минут] является наличие специального дыхательного аппарата. в записи Си это выглядит примерно так: for(; акваланг != 0; ){плаваем}. по-вашему выходит, что отсутсвие всяких условий (for(;;)) вам позволит плавать под водой как угодно долго, как Ихтиандр? wink.gif вы же программист, логика у вас должна сидеть в мозгу лучше, чем даже родной язык! вдумайтесь!

и снова: даже если согласиться, что отсутствие условия для продолжения означает БЕЗУСЛОВНОЕ ПРОДОЛЖЕНИЕ, то почему не работает while() - ему надо ОБЯЗАТЕЛЬНО указать условие?! как тут с логикой?


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post

5 страниц V  « < 2 3 4 5 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 07:09
Рейтинг@Mail.ru


Страница сгенерированна за 0.01492 секунд с 7
ELECTRONIX ©2004-2016