Здравствуйте, CreatorCray, Вы писали:
CC>Здравствуйте, Pyromancer, Вы писали:
P>>О! даже лучше придумал, чтоб и континуй воткнуть
CC>Ну что? делаем конкурс: кто еще сильнее запутает приведенный кусок кода?
Тот метод, который я приведу внизу, не является прямым эквивалентом этого кода. Но с помощью него можно избавиться от явных goto. Этот стиль обработки ошибок был и остаётся очень популярным на одной платформе (какой догадайтесь сами ).
HRESULT init(void **);
void destroy(void *);
// CHR - Check HRESULT#define CHR(x) \
do \
{ \
hr = x; \
if (FAILED(hr)) \
{ \
DebugLog(hr); \
goto Error; \
} \
} while (0)
HRESULT foo()
{
HRESULT hr = S_OK;
void * d1 = NULL;
void * d2 = NULL;
void * d3 = NULL;
CHR(init(&d1));
CHR(init(&d2));
CHR(init(&d3));
// .. some code
Error:
if (d1) destroy(d1);
if (d2) destroy(d2);
if (d3) destroy(d3);
return hr; // the only return statement in the function
}
Чтобы этот метод работал нужно следовать нескольким правилам:
1. в начале функции объявляется код возврата HRESULT hr = S_OK.
2. все ресурсы объявляются также в начале функции и инициализируются NULL.
3. в теле функции нет return statements. Единственный return — это return hr, который находится в конце функции.
4. метка Error зарезервированна для обработки ошибок.
5. нельзя объявлять переменные не POD классов внутри функции, только в начале. Такой код:
CHR(init(&d1));
RAIIClass obj;
Error:
if (d1) destroy(d1);
return hr;
может очень плохо отработать (или вообще не скомпилируется). Это наблюдение показывает, что данный метод — из разряда агрессивных C-style методов. Он не допускает использование типичных C++-style идиом.
Здравствуйте, Pyromancer, Вы писали:
P>>>О! даже лучше придумал, чтоб и континуй воткнуть CC>>Ну что? делаем конкурс: кто еще сильнее запутает приведенный кусок кода? P>А разве не это цель замены goto на непонятно что?
Неа. Цель — убрать goto так, чтобы код стал более читабелен.
ЗЫ: На реплики про "с goto код более читабелен чем без него" отвечать не стану.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
AS>>Только не MIPS (насколько я помню, мипс это просто некий сабсет RISC с длинным конвейером), а VLIW?
К>Перепутал. Не MIPS, а ARM.
Какое отношение приведенный код имеет к ARM? Архитектурно они обычные risk процессоры, насколько мне помнится. В твоем варианте, как я понимаю, основной упор на отсутствие переходов (хотя неявно они там есть, конечно) — так это машины с VLIW, где этим делом управляет компилятор — см. трансмета, IA64 и эльбрус 3.
Здравствуйте, Andrew S, Вы писали:
AS>Какое отношение приведенный код имеет к ARM? Архитектурно они обычные risk процессоры, насколько мне помнится. В твоем варианте, как я понимаю, основной упор на отсутствие переходов (хотя неявно они там есть, конечно) — так это машины с VLIW, где этим делом управляет компилятор — см. трансмета, IA64 и эльбрус 3.
AS>>Какое отношение приведенный код имеет к ARM? Архитектурно они обычные risk процессоры, насколько мне помнится. В твоем варианте, как я понимаю, основной упор на отсутствие переходов (хотя неявно они там есть, конечно) — так это машины с VLIW, где этим делом управляет компилятор — см. трансмета, IA64 и эльбрус 3.
К>Имеет такое отношение, что у этих процессоров есть условное исполнение команды. К>http://en.wikipedia.org/wiki/Acorn_RISC_Machine
Ну и какое отношение этот код имеет к ARM? На уровне компилятора, что if, что && в данном случае безразлично (у if семантика напротив более естественна для тех же addххх — см. тот же пример в википедии). Условное исполнение есть у многих процессоров, безотносительно их архитектуры. Зато я теперь понял, что это за код — это в стиле perl
Здравствуйте, unreg_flex, Вы писали:
_>Ну раз все так легко, то еще вот этот маленький кусочек тоже переведите, plz!
Можно тоже разрулить, нужно два булевых флага и пучок ифов и брейков,
только скажите куда этот код пойдёт, неохота потом попасть на работу, где надо будет его поддерживать
Здравствуйте, Kolhoz, Вы писали: K> Может хотя бы фамилия автора заставит их, дурачков, задуматься.
Может, хотя бы бан на 30 дней заставит тебя задуматься. Рекомендую освободившееся время, которое ты посвящал оскорблениям посетителей RSDN, потратить на изучение обязательных правил.
1.1.4 stable rev. 510
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, ДимДимыч, Вы писали:
ДД>Здравствуйте, Кодт, Вы писали: К>>Про goto мы уже поговорили, а вот теперь поговорим про МАКРОСЫ на пол-страницы
ДД>Дык повторно используемый код...