Email or username:

Password:

Forgot your password?
Данила Горелко

Второй раз за жизнь использовал goto в Си.
Пригождается всё-таки такая мелочь

7 comments
iliazeus

@danilax86 а как в C без goto подчищать ресурсы при ошибках? Или раньше не приходилось?

Данила Горелко

iliazeus, вот как раз это было моё первое столкновение с goto, когда писал лабу по переворачиванию bmp картинки. При ошибке поворота, освобождалось место и программа то ли завершалась, то ли просила пользователя предоставить другую картинку.

Сейчас же просто заковыристый цикл нужно было написать, а я поленился, но вспомнил про goto.

Пишу на Си пока что преимущественно под железки. Тут нечего очищать или выделять. Тут с этим беда)) Динамика запрещена.

Григорий Клюшников

Данила, а какая может быть ошибка при повороте картинки? Памяти на буфер нет? В файл записать не получилось?

kurator88

@iliazeus @danilax86 а можешь код показать, давно С не трогал и не понимаю о чем речь

iliazeus

@kurator88 @danilax86 что-то вроде:

R* result = ERROR;

A* a = create_a_or_fail();
if (!a) goto cleanup_a;

B* b = create_b_or_fail();
if (!b) goto cleanup_b();

C* c = get_c_or_fail();
if (!c) goto cleanup_c;

result = do_stuff(a, b, c);

cleanup_c:
destroy_c(c);

cleanup_b:
destroy_b(b);

cleanup_a:
destroy_a(a);

return result;

@kurator88 @danilax86 что-то вроде:

R* result = ERROR;

A* a = create_a_or_fail();
if (!a) goto cleanup_a;

B* b = create_b_or_fail();
if (!b) goto cleanup_b();

C* c = get_c_or_fail();
if (!c) goto cleanup_c;

result = do_stuff(a, b, c);

cleanup_c:
destroy_c(c);

cleanup_b:
destroy_b(b);

cleanup_a:
destroy_a(a);

iliazeus

@kurator88 @danilax86 не жди, что этот код без багов, сам на си тоже давно не писал :)

В целом, для корректного сбора ресурсов, который в других языках делают деструкторы или финализаторы или defer. Освободить ресурсы в правильном порядке, при этом без double free и без дублирования кода.

BunnyInAHat

@iliazeus Фигурные скобочки же! А то можно получить классику при достаточном количестве повторений.
imperialviolet.org/2014/02/22/

Go Up