Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Сквозной Return


Автор: sonar 7.6.2005, 17:12
Привет всем!

Исходник:

unsigned char Index;
unsigned char Tag;

unsigned char ReadBuffer(void)
{
Tag = Buffer[Index];
}

unsigned char parser(void)
{
ReadBuffer();
// if (!ReadBuffer()) return 1; <= ПЛОХО!!!

// обработка тега

ReadBuffer();
// if (!ReadBuffer()) return 1; <= ПЛОХО!!!

// обработка тега
}

Комментарий: парсер получает в глобальной переменной считанный байт из буфера и затем его обрабатывает определенным образом

Задача: если ReadBuffer не смогла прочесть байт (IndexBuffer>LengthBuffer) необходимо за раз выйти и из ReadBuffer и из parser в main (типа число байт не достает, конец парсинга). Проверять каждый раз на корректность выполнения ReadBuffer - громоздко!

Кто че может посоветовать?

С Уважением! sonar

Автор: Дрон 7.6.2005, 17:28
***Прошу учесть, что на нашем форуме есть замечательная подсветка синтаксиса, улучшающая читаемость кода***

Как раз для таких вещей служат исключения (exceptions). Если ты пишешь под Windows, то это будет самым оптимальным решением. Под ДОС реализации исключений я не видел, там есть более сложные способы, например непосредственный переход (a-la goto) между функциями.

Автор: sergejzr 7.6.2005, 17:35
В каком нибудь месте тебе ведь всё равно проверять придётся. И с иключениями проверка тоже идёт.
ИМХО там, где ты написал "ПЛОХО" это даже хорошо. Всё нужное будет находится в кэше процессора. Это вообще тяжело за затраты времени считать smile

Или реально тормозит? Проверь на время...

Автор: Дрон 7.6.2005, 17:46
sergej.z
Затраты на обработку случившегося исключения действительно велики. Но сам механизм исключений даётся практически бесплатен smile

Там, насколько я помню, идёт небольшой код, который инициализирует обработчик. А дальше если исключения не произошло, то больше никаких затрат и нет.

Автор: sergejzr 7.6.2005, 17:49
Исключение ведь тоже надо "кидать" по условию. Само то оно не произойдёт.. Во всяком случае из кода не видно..

Автор: Дрон 7.6.2005, 17:54
sergej.z
Но кидать-то нужно один раз в самой вложенной функции. А ловить только в main.

Если же без исключений и там штук пять вложенных функций. То в каждой нужно проверку делать... Хотя я так и поступал, когда писал под ДОС. Реально там не такие уж и страшные затраты времени на выполнение if smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)