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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Исключение вызова функции - это правильно?
Dog Pawlowa
сообщение Nov 19 2008, 11:49
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Уже было, но я не запомнил sad.gif

Если вызов записан вот так
if (NewErrorFound()) ;
то функция не вызывается.
А если так
NewErrorFound();
то вызывается.

Разве результат функции, возвращаемой значение, не приравнивается к volatile ?
Пожалуй, не так спросил...
Ткните, в чем я неправ - я предполагал, что функция будет вызываться в любом случае.


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
dxp
сообщение Nov 19 2008, 12:25
Сообщение #2


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(Dog Pawlowa @ Nov 19 2008, 17:49) *
Если вызов записан вот так
if (NewErrorFound()) ;
то функция не вызывается.

Почему не вызывается? Должна вызываться. А как иначе можно определить значение выражения в условии? Только функция должна что-то возвращать, иначе смысла нет.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
andrew_b
сообщение Nov 19 2008, 12:35
Сообщение #3


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

Группа: Свой
Сообщений: 1 975
Регистрация: 30-12-04
Из: Воронеж
Пользователь №: 1 757



Цитата(dxp @ Nov 19 2008, 16:25) *
Почему не вызывается? Должна вызываться. А как иначе можно определить значение выражения в условии?
А дальше что? В if кроме проверки условия ничего не делается, поэтому компилятор мог соптимизировать это код.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 19 2008, 12:54
Сообщение #4


Гуру
******

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



Цитата(Dog Pawlowa @ Nov 19 2008, 13:49) *
Уже было, но я не запомнил sad.gif
Это? Я тоже почти 20 минут убил на поиск.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
rezident
сообщение Nov 19 2008, 15:54
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Что-то я не догоняю. Если в результате выполнения/невыполнения условия ничего не делается, то зачем там вообще if? Нельзя что ли просто вызов функции вставить? Какой смысл в проверке условия?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 19 2008, 18:32
Сообщение #6


Гуру
******

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



Цитата(rezident @ Nov 19 2008, 17:54) *
зачем там вообще if?
Рискну предположить, что это шаманство по мотивам недавнего обсуждения


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
rezident
сообщение Nov 19 2008, 22:16
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(Сергей Борщ @ Nov 19 2008, 23:32) *
Рискну предположить, что это шаманство по мотивам недавнего обсуждения
А в каком случае простое чтение переменной вызывает ее модификацию? cranky.gif Или это про I/O регистры?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 20 2008, 06:32
Сообщение #8


Гуру
******

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



Цитата(rezident @ Nov 20 2008, 00:16) *
А в каком случае простое чтение переменной вызывает ее модификацию? cranky.gif Или это про I/O регистры?
Да, про I/O. А о чем вопрос этого топика - совершенно непонятно.
Dog Pawlowa: уточните вопрос, приведите содержимое NewErrorFound().


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
scifi
сообщение Nov 20 2008, 06:56
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Коль скоро речь зашла о шаманстве, приведу ещё один перл из коллекции неочевидных трюков с использованием языка Си:
Код
#define assert_static(e) \
  do { \
    enum { assert_static__ = 1/((e)?1:0) }; \
  } while (0)
Go to the top of the page
 
+Quote Post
dxp
сообщение Nov 20 2008, 07:14
Сообщение #10


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(andrew_b @ Nov 19 2008, 18:35) *
А дальше что? В if кроме проверки условия ничего не делается, поэтому компилятор мог соптимизировать это код.

Если компилятор видит потроха функции, то да, имеет полное право. А если не видит (а в общем случае это так), то так делать нельзя. Другое дело, что в любом случае код из if(f()) ; трансформируется в f(); Но функция должна вызываться, и она должна возвращать осмысленное для проверки условия значение.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Nov 20 2008, 12:38
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 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".

Может, все не очень красиво и оптимально, но граблями то зачем?


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 20 2008, 16:43
Сообщение #12


Гуру
******

Группа: Модераторы
Сообщений: 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) *
Может, все не очень красиво и оптимально, но граблями то зачем?
biggrin.gif Штудируйте:
Цитата
Юзе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)
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Nov 20 2008, 16:52
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(Сергей Борщ @ Nov 20 2008, 20:43) *
Штудируйте

Спасибо. Я еще прошелся по краешку судьбы грабель.

Пожалуй, мое понимание volatile было несколько усеченным.
Это не просто возможность изменения в прерывании, это вообще возможность переменной там, где компилятор в настоящий момент не видит.
Об этом думать я не хочу, вывод - ставить volatile везде ?


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
rezident
сообщение Nov 20 2008, 17:13
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(Dog Pawlowa @ Nov 20 2008, 21:52) *
вывод - ставить volatile везде ?
Конечно нет. Только там, где это действительно необходимо. Чтобы не ограничивать компилятор в способах оптимизации, но при этом объяснить ему, что вы от него хотите.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 20 2008, 17:30
Сообщение #15


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 17th June 2025 - 17:19
Рейтинг@Mail.ru


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