Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Исключение вызова функции - это правильно?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
Dog Pawlowa
Уже было, но я не запомнил sad.gif

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

Разве результат функции, возвращаемой значение, не приравнивается к volatile ?
Пожалуй, не так спросил...
Ткните, в чем я неправ - я предполагал, что функция будет вызываться в любом случае.
dxp
Цитата(Dog Pawlowa @ Nov 19 2008, 17:49) *
Если вызов записан вот так
if (NewErrorFound()) ;
то функция не вызывается.

Почему не вызывается? Должна вызываться. А как иначе можно определить значение выражения в условии? Только функция должна что-то возвращать, иначе смысла нет.
andrew_b
Цитата(dxp @ Nov 19 2008, 16:25) *
Почему не вызывается? Должна вызываться. А как иначе можно определить значение выражения в условии?
А дальше что? В if кроме проверки условия ничего не делается, поэтому компилятор мог соптимизировать это код.
Сергей Борщ
Цитата(Dog Pawlowa @ Nov 19 2008, 13:49) *
Уже было, но я не запомнил sad.gif
Это? Я тоже почти 20 минут убил на поиск.
rezident
Что-то я не догоняю. Если в результате выполнения/невыполнения условия ничего не делается, то зачем там вообще if? Нельзя что ли просто вызов функции вставить? Какой смысл в проверке условия?
Сергей Борщ
Цитата(rezident @ Nov 19 2008, 17:54) *
зачем там вообще if?
Рискну предположить, что это шаманство по мотивам недавнего обсуждения
rezident
Цитата(Сергей Борщ @ Nov 19 2008, 23:32) *
Рискну предположить, что это шаманство по мотивам недавнего обсуждения
А в каком случае простое чтение переменной вызывает ее модификацию? cranky.gif Или это про I/O регистры?
Сергей Борщ
Цитата(rezident @ Nov 20 2008, 00:16) *
А в каком случае простое чтение переменной вызывает ее модификацию? cranky.gif Или это про I/O регистры?
Да, про I/O. А о чем вопрос этого топика - совершенно непонятно.
Dog Pawlowa: уточните вопрос, приведите содержимое NewErrorFound().
scifi
Коль скоро речь зашла о шаманстве, приведу ещё один перл из коллекции неочевидных трюков с использованием языка Си:
Код
#define assert_static(e) \
  do { \
    enum { assert_static__ = 1/((e)?1:0) }; \
  } while (0)
dxp
Цитата(andrew_b @ Nov 19 2008, 18:35) *
А дальше что? В if кроме проверки условия ничего не делается, поэтому компилятор мог соптимизировать это код.

Если компилятор видит потроха функции, то да, имеет полное право. А если не видит (а в общем случае это так), то так делать нельзя. Другое дело, что в любом случае код из if(f()) ; трансформируется в f(); Но функция должна вызываться, и она должна возвращать осмысленное для проверки условия значение.
Dog Pawlowa
Цитата(Сергей Борщ @ 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".

Может, все не очень красиво и оптимально, но граблями то зачем?
Сергей Борщ
Цитата(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авнить ощущения.

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

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

Пожалуй, мое понимание volatile было несколько усеченным.
Это не просто возможность изменения в прерывании, это вообще возможность переменной там, где компилятор в настоящий момент не видит.
Об этом думать я не хочу, вывод - ставить volatile везде ?
rezident
Цитата(Dog Pawlowa @ Nov 20 2008, 21:52) *
вывод - ставить volatile везде ?
Конечно нет. Только там, где это действительно необходимо. Чтобы не ограничивать компилятор в способах оптимизации, но при этом объяснить ему, что вы от него хотите.
Сергей Борщ
Цитата(Dog Pawlowa @ Nov 20 2008, 18:52) *
Пожалуй, мое понимание volatile было несколько усеченным.
Это не просто возможность изменения в прерывании, это вообще возможность переменной там, где компилятор в настоящий момент не видит.
Стоп. Я чего-то зациклился, что ваша программа многопоточная и error_flags может измениться другим потоком. Если это так - то да, обязательно volatile. А если программа однопоточная и error_flags не меняются в прерываниях - то компилятор оказался умнее вас и просчитал, что с момента последнего обновления error_flags не изменились или current_error не будет использован до следующего его же обновления. Тогда, если вы хотите остановить программу и посмотреть current_error отладчиком, надо сделать volatile только current_error.
Dog Pawlowa
Цитата(Сергей Борщ @ Nov 20 2008, 21:30) *
Я чего-то зациклился, что ваша программа многопоточная и error_flags может измениться другим потоком.

Ну, я всего лишь программирующий инженер, и понятие "поток" мне неведомо smile.gif
Можно ли назвать многопоточной это ? :
Код
switch (event)
{  case 1:  Service1(); break;
    case 2:  Service2(); break;
}

Выводы я сделал - быть проще. Собственно, примененная мной конструкция есть не что иное, как проявление плохого стиля программирования, за что я и был наказан.
Вопрос абстрактной справедливости скорее второстепенный.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.