![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
Rockie |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1143 Регистрация: 23.4.2006 Репутация: 8 Всего: 31 |
Anton Vatchenko, вопрос не оч. понятен, но наверное можно использовать глобальную переменную - флаг, например:
и уже из разных функций считывать/устанавливать ее значение. -------------------- Чтобы иметь большой гардероб - надо иметь большой гардероб. |
|||
|
||||
MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
хм, интересная логика -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
bilbobagginz |
|
|||
![]() Naughtius Maximus ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8813 Регистрация: 2.3.2004 Где: Israel Репутация: 3 Всего: 317 |
MAKCim, я сам на Си пишу, когда нужно
![]() я не против Си, а к тому, что если уже пишешь приложение на Си, нужно серьезно взвешивать, если это и есть путь истинный - коли тебе нужны исключения и т.д. - не фиг писАть на Си. а насчет табу "goto", кто занимается встроенным программированием знает, что именно в этой сфере табу goto нарушается чаще чем в других - если нужно приграммировать эффективно и компактно, goto часто спасает. -------------------- Я ещё не демон. Я только учусь. |
|||
|
||||
ivashkanet |
|
|||
![]() Кодю потиху ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3684 Регистрация: 23.2.2006 Где: Гомель, Беларусь Репутация: нет Всего: 149 |
MAKCim, хороший пример, но: у тебя только одна функция, а не В пределах одной функции проблема ясна и решается более-менее просто. Вопрос ведь в том, как "просигналить" функциям которые выше текущей по стеку, а не в том, как обработать ситуацию в самой функции.
Не совсем понятно, но все же: В С/С++ можно "прыгать" за пределы функции в другую функцию? И что тогда будет со стеком, что будет с методом, который вызвал эту функцию и ожидает ответа от нее? В любом случае механизм получится негибким. Что будет если мы захотим добавть новую функцию в цепочку... ИМХО, лучший способ. А вместо try/catch --- if/else Правда наличие выставленного флага не прерывает выполнение функции и не ищет "ближайшую инструкцию отлова этого флага" (как в случае с exception), но это, все-таки, решение. |
|||
|
||||
MAKCim |
|
||||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
ошибки в функциях обрабатывать с помоощью goto <обработчик> и возвращать код ошибки применяя рекурсивно данный подход ко всем функциям в программе - решаем проблему
Добавлено через 2 минуты и 28 секунд bilbobagginz, вообщем согласен но, имхо, исключения - это не такая большая проблема, чтобы менять язык разработки -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
||||
|
|||||
ivashkanet |
|
|||
![]() Кодю потиху ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3684 Регистрация: 23.2.2006 Где: Гомель, Беларусь Репутация: нет Всего: 149 |
Повторяю еще раз: внутри самой функции можно хоть с ГоуТами, хоть с Ифами, хоть с чем угодно. Твой код, например, можно запросто переписать не используя goto и смотреться он будет не менее красиво.
Вот тут самая тонкость. Но все же, это решение (которое я давал несколькими постами выше). Итог (личное мое ИМХО): Лучший вариант --- возвращать код ошибки и обрабатывать его во всех функциях, которые в этом нуждаются. Тоже вариант --- выставлять некий флаг и "ждать" его в определенном месте, если он пришел, то объявлять ошибочными все данные полученные до этой строчки и обрабатывать ошибку. (этот вариант ближе к механизму exception'ов, но, ИМХО, хуже, так как выполнение программы продолжается). |
|||
|
||||
MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
![]() ![]() ![]() (только на С пожалуйста) Это сообщение отредактировал(а) MAKCim - 12.4.2007, 08:52 -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
bilbobagginz |
|
|||
![]() Naughtius Maximus ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8813 Регистрация: 2.3.2004 Где: Israel Репутация: 3 Всего: 317 |
смотря какие аспекты механизма исключения тебе нужны. да, хотелось бы видеть читабельный и удобный для доработок примерчик без goto ![]() (сумлеваюсь, что есть такой...) -------------------- Я ещё не демон. Я только учусь. |
|||
|
||||
ivashkanet |
|
||||||
![]() Кодю потиху ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3684 Регистрация: 23.2.2006 Где: Гомель, Беларусь Репутация: нет Всего: 149 |
MAKCim, bilbobagginz, вот пример без goto и, ИМХО, не менее читабельный (по мне, даже более)
+ работа с ресурсами и "сборка мусора" превратились в два, относительно, независимых процесса. 1) Вариант кода с излишними коментариями:
2) Вариант того же кода, но без лишних коментариев:
Жду ваших комментариев ![]() P.S. Код отформатирован так, как я люблю, поэтому он кажется громоздким. Но если его отформатировать в стиле MAKCim'а, то он будет не намного больше, чем с goto. P.P.S. "Отлов ошибок" можно было оставить и в первом блоке, но, ИМХО, ему логичнее быть именно во втором. P.P.P.S. Проверил несколько раз, но все равно могут быть несостыковки, так что сильно ногами не пинать ![]() Добавлено через 13 минут и 43 секунды А если еще совместить первые два блока, то еще лучше получится:
|
||||||
|
|||||||
powerfox |
|
|||
![]() I wanna fork() ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3990 Регистрация: 1.10.2005 Где: Санкт-Петербург Репутация: 2 Всего: 97 |
ivashkanet, твой код ничем особенным не отличается от кода Максима, так как ты, по сути дела, просто перенёс тела функций по обработке ошибок в основную, что не есть хорошо:
1. Такой стиль подвержен ошибкам + тяжело их отслеживать (делать локализацию ошибки). 2. Если ошибка возникла в самом начале, то зачем продолжать выполнение функции? Это лишнее время (пользователя и машинное). 3. Читается хуже. Читающий программу увидит, конечно, что ты в случае ошибки что-то творишь с переменной error (и прочее), но чем рысскать по коду, лучше сразу перейти к функциям-обработчикам. Код Максима - классический пример того, как подобные вещи пишутся на Си. |
|||
|
||||
ivashkanet |
|
||||||||
![]() Кодю потиху ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3684 Регистрация: 23.2.2006 Где: Гомель, Беларусь Репутация: нет Всего: 149 |
Даже больше: ничем, кроме отсутствия goto
Кто к чему привык ;-) Мне понятнее мой вариант. Тем более с нормальными коментариями.
Посмотри внимательно, ИМХО, у меня нет ни одной лишней инструкции после возникновения ошибки. Только то, что нужно для удаления ресурсов. То же что и по первому пункту.
Разные задачи требуют разные подходы к ее решению. В данном случае, когда требуется скорость работы, код Максима, возможно, и лучше. Добавлено через 1 минуту и 6 секунд
Вот это я не понял :( |
||||||||
|
|||||||||
powerfox |
|
||||
![]() I wanna fork() ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3990 Регистрация: 1.10.2005 Где: Санкт-Петербург Репутация: 2 Всего: 97 |
Извини, просто невчитался.
По поводу стиля, я мнение не поменял. Но по поводу конкретного примера: Максим для каждой ошибки вызывал свой разработчик. Ты возвращаешь код ошибки, то есть функция, которая получила его, должна сама что-то предпринять. |
||||
|
|||||
MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
ivashkanet,
не все так гладко ![]() по функционалу, конечно, все верно, но 1. Код менее читабелен (имхо) 2. Количество вложенных if-ов растет пропорционально количеству выделенных ресурсов 3. Необходимость повторения "лесенки" из if-ов 2 раза 4. Эффективность кода страдает (вложенные if-ы при всей оптимизации ничего хорошего кроме частой перезагрузки конвеера не дают)
я не знаю, ты конечно можешь утверждать, что тебе он понятнее и т. п, но, честно говоря, если бы такой код, как у тебя, попался мне в реальном проекте, я бы его скорее всего (если бы была такая возможность) переписал -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
ivashkanet |
|
||||
![]() Кодю потиху ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3684 Регистрация: 23.2.2006 Где: Гомель, Беларусь Репутация: нет Всего: 149 |
goto: xy --- это вызов своего обработчика? Не согласен. Мой код делает ТО ЖЕ САМОЕ, что и код Максима. P.S. ИМХО, если взять ну очень умный компилятор, то он должен преобразовать мой и Максима код в одни и те же инструкции. Причем, эти инструкции будут ближе к коду Максима (это только потому, что компиляторы вовсю используют goto направо и налево ![]() Добавлено через 10 минут и 57 секунд MAKCim, ![]() Вторую "лесенку" можно заменить на отдельные if-ы, правда код будет менее эффективен.
Наличию связанных выделенных ресурсов. А никто не говорит, что я такой код написал бы у себя в проекте, боже упаси ![]() Просто я предоставил код без goto максимально приближенный к твоему. |
||||
|
|||||
MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
goto = jmp, вызов функции = call, jmp - более эффективен без разницы, связаны они или нет, главное их освободить кроме того, в моем примере только создание ключа (ftok()) связано с возможностью дальнейшего выполнения -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |