|
Исключение вызова функции - это правильно? |
|
|
|
Nov 19 2008, 11:49
|
Гуру
     
Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823

|
Уже было, но я не запомнил Если вызов записан вот так if (NewErrorFound()) ; то функция не вызывается. А если так NewErrorFound(); то вызывается. Разве результат функции, возвращаемой значение, не приравнивается к volatile ? Пожалуй, не так спросил... Ткните, в чем я неправ - я предполагал, что функция будет вызываться в любом случае.
--------------------
Уходя, оставьте свет...
|
|
|
|
|
Nov 20 2008, 06:32
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(rezident @ Nov 20 2008, 00:16)  А в каком случае простое чтение переменной вызывает ее модификацию?  Или это про I/O регистры? Да, про I/O. А о чем вопрос этого топика - совершенно непонятно. Dog Pawlowa: уточните вопрос, приведите содержимое NewErrorFound().
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Nov 20 2008, 12:38
|
Гуру
     
Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823

|
Цитата(Сергей Борщ @ Nov 20 2008, 10:32)  Да, про I/O. А о чем вопрос этого топика - совершенно непонятно. Dog Pawlowa: уточните вопрос, приведите содержимое NewErrorFound(). Извините, кроме программирования чем только не приходится заниматься... Итак, функция вот: Код char NewErrorFound(void) { char i; for (i=1; i<erQty; i++) { if ( (error_flags[i]&ERROR_CONFIRMED_MASK)==ERROR_NOT_CONFIRMED) { current_error=i; error_flags[i]|=CURRENT_BIT; return 1; } } return 0; } Сканирует массив ошибок, находит неподтвержденную ошибку и возвращет факт, что она найдена. Переменные не volatile. Использование возвращаемого значение зависит от места вызова функции - в одном случае используется, а в другом("процитированном") - нет. Там она вызывается вот ради этого спрятанного "current_error=i". Может, все не очень красиво и оптимально, но граблями то зачем?
--------------------
Уходя, оставьте свет...
|
|
|
|
|
Nov 20 2008, 16:43
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(Dog Pawlowa @ Nov 20 2008, 14:38)  Переменные не volatile. Если, как сказал dxp, компилятор видит тело функции, то имеет право. Хотите правильно - и current_error и error_flags объявляйте volatile Цитата(Dog Pawlowa @ Nov 20 2008, 14:38)  Может, все не очень красиво и оптимально, но граблями то зачем?  Штудируйте: Цитата Юзеp - человек, наступающий на гpабли. Чайник - начинающий юзеp, ни pазу не наступавший на гpабли и потому увеpенный, что гpаблей не существует. Ламеp - юзеp, pегуляpно наступающий на гpабли, но по-пpежнему увеpенный что гpаблей не существует. Узкий специалист - юзеp, в совеpшенстве владеющий наступанием на одни и те же гpабли. Шиpокий специалист - юзеp, имеющий на лбу более двух шишек. Пpогpаммеp - тот, для кого в наступании на гpабли важнее всего pезультат. Устав наступать на чужие гpабли, изготавливает свои собственные. Пpодвинутый пpогpаммеp - пpогpаммеp, наступающий на каждые гpабли не более двух pаз. Копиpайт - концепция, огpаничивающая количество доступных для наступания гpаблей финансовыми возможностями юзеpа. Геймеp - тот, для кого в наступании на гpабли важнее всего пpоцесс. Обычно не способен изготовить собственные гpабли. Читеp - pазновидность геймеpа; наступает только на гpабли с поpолоновыми насадками на pучке и обычно не больше одного pаза. Хакеp - тот, кто способен наступить на гpабли, даже если они спpятаны в саpай и запеpты на замок. Хакеp-идеалист - благоpодный боpец за пpаво каждого наступать на неогpаниченное количество гpаблей. Microsoft - коpпоpация, всемиpный лидеp по пpоизводству гpаблей. Билл Гейтс - мифическое существо из пpогpаммеpского фольклоpа; злой дух - покpовитель гpаблей. Апгpейд - пpоцесс пеpманентной тpаты денег на покупку все новых гpаблей, каждые из котоpых бьют больнее пpедыдущих. Бета-веpсия - веpсия, в котоpой гpабли видны невооpуженным глазом. Релиз - веpсия, в котоpой гpабли пpисыпаны листьями. Совместимость веpсий - пpинцип, позволяющий новым гpаблям попадать точно по шишке от пpедыдущих. Ассемблеp - язык пpогpаммиpования, позволяющий наступать на гpабли несколько миллионов pаз в секунду. Локальная сеть - технология, позволяющая получить по лбу, даже когда на гpабли наступает кто-то дpугой. Интеpнет - технология, позволяющая наступить на гpабли, находящиеся на дpугой стоpоне земного шаpа. Сетевая конфеpенция - технология, позволяющая каждому наступить не только на свои, но и на чужие гpабли. Русские кодиpовки - подаpочный набоp гpаблей для пользователей интеpнета. Дpужественный интеpфейс - pезиновая накладка на pучку гpаблей. Гибкий (настpаиваемый) интеpфейс - накладка на pучку гpаблей, котоpую можно двигать, подгоняя под высоту своего лба. Гpафический интеpфейс - гpабли, позволяющие pегулиpовать цвет и интенсивность искp после удаpа по лбу. Hенадежная система - гpабли, котоpые бьют вас даже тогда когда вы на них не наступаете. Hадежная система - гpабли, котоpые бьют вас по лбу, даже когда вы стоите к ним спиной. Многозадачность - концепция, позволяющая наступать на несколько гpаблей одновpеменно. Объектно-оpиентиpованное пpогpаммиpование - метод изготовления гpаблей по пpинципу матpешки. Мануал - книга, описывающая pазличные способы наступания на гpабли. Hикогда не используется ламеpами и хакеpами. Пpодвинутые пpогpаммеpы используют ее после того, как наступят на те же гpабли во втоpой pаз. Техподдеpжка - служба, дающая советы, что делать после наступания на гpабли. Обычно пеpвый ее совет - наступить на гpабли еще pаз и сpавнить ощущения.
©??????
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Nov 20 2008, 16:52
|
Гуру
     
Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823

|
Цитата(Сергей Борщ @ Nov 20 2008, 20:43)  Штудируйте Спасибо. Я еще прошелся по краешку судьбы грабель. Пожалуй, мое понимание volatile было несколько усеченным. Это не просто возможность изменения в прерывании, это вообще возможность переменной там, где компилятор в настоящий момент не видит. Об этом думать я не хочу, вывод - ставить volatile везде ?
--------------------
Уходя, оставьте свет...
|
|
|
|
|
Nov 20 2008, 17:30
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(Dog Pawlowa @ Nov 20 2008, 18:52)  Пожалуй, мое понимание volatile было несколько усеченным. Это не просто возможность изменения в прерывании, это вообще возможность переменной там, где компилятор в настоящий момент не видит. Стоп. Я чего-то зациклился, что ваша программа многопоточная и error_flags может измениться другим потоком. Если это так - то да, обязательно volatile. А если программа однопоточная и error_flags не меняются в прерываниях - то компилятор оказался умнее вас и просчитал, что с момента последнего обновления error_flags не изменились или current_error не будет использован до следующего его же обновления. Тогда, если вы хотите остановить программу и посмотреть current_error отладчиком, надо сделать volatile только current_error.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|