LINUX.ORG.RU
Ответ на: комментарий от Zorn

да такое много где встречаеться
просто сказали мне тут некоторые - что гото это плохо - я несколько удивился

ae1234 ★★
() автор топика
Ответ на: комментарий от damnemall

ну функция например и должна была память нагенерить и настройки произвести

ae1234 ★★
() автор топика
Ответ на: комментарий от AlexCones

суть такого стиля - это проверка и освобождение ресурсов в одном месте - внизу функции
иначе - при любой проверке - нужно анализировать и освобождать те ресурсы что были заняты до этой проверке - а их колво все возрастает

а так - весь откат этой типа «транзакции» осуществляется в одном месте

ae1234 ★★
() автор топика
Ответ на: комментарий от AlexCones

тут гото не для нормальной работы - а для обработки исключений (ошибок)

ae1234 ★★
() автор топика
Ответ на: комментарий от AlexCones

Все метки у него идут на конец и никому не мешают. Согласен, что goto надо не часто, но goto-фобия - это плохо.

Кстати, треды такие возникают тут весьма часто. Точно сказать не могу, так как сам нечасто тут сижу

Zorn
()

что такое хороший стиль - решаешь ты сам. и никто другой

ananas ★★★★★
()
Ответ на: комментарий от AlexCones

функция превращеться в этакий счетчик - где каждая проверка - это типа +1 к стадии выполнения
как счетчик достигнет вершины - функция выполнена - трназакция завершалиась
а если нет - то начинаеться откат изменений - и откат идет от той стадии выполнения - до которой увеличился счетчик

ae1234 ★★
() автор топика
Ответ на: комментарий от AlexCones

посмотри на javascript - вот там макороны и без goto клепают.

а вообще 1 2 goto в функции это ничего. Ты просто никогда не писал код на QuickBasic

visual ★★★
()

Лучше в C все равно не сделать. Избавляться от goto ради избавления от goto — детский сад.

anonymous
()

В ядре так часто делают. Им можно, kernel кодеры работают в gods mode :)

В userspace приложениях можно вполне обходиться без goto, и если вдруг код от вложенных if-ов становится страшным, это знак к тому, что пора бы подумать о микро-редизайне этого участка кода.

qrck ★★
()
Ответ на: комментарий от AlexCones

Выбирай: дублирование кода в каждом обработчики или goto в конец функции. Где больше «макаронная фабрика?» Второй случай — это такой try-catch для C. Смущает слово «goto» — можно скрыть макросами или заменить на do-while-break.

anonymous
()

Правильно ananas сказал: return должен быть один.

Тогда уж первый return true; выкинь, а в конце функции напиши что-то типа:

return (check) ? false : true;
DeVliegendeHollander ★★
()
Ответ на: комментарий от ae1234

предлагаеш ради этого делать еще один гото ? :)

func(){
    res = 0;
    .....
    p1=malloc();
    .....
    if(check) goto RE_0;
    .....
    .....
    p2=malloc();
    .....
    if(check) goto RE_1;
    .....
    res = 1;
RE_1: free(p2);
RE_0: free(p1);
    retuen res;
    }

?

damnemall
()
Ответ на: комментарий от damnemall

а если эти два блока памяти должны быть остаться ?

ae1234 ★★
() автор топика
Ответ на: комментарий от ae1234

предлагаеш ради этого делать еще один гото ? :)

нет. предлагаю говнокод преобразовать в элегантное

int func(void){
    int ret = 0;
    .....
    p1 = p2 = NULL;
    .....
    p1=malloc();
    .....
    if(check) goto RE_0;
    .....
    p2=malloc();
    .....
    if(check) goto RE_1;
    .....
    ret = 1;
    .....
RE_1: 
    free(p2);
RE_0: 
    free(p1);
    return ret;
}
ananas ★★★★★
()

Лучше делать как-то так...

struct {
   void *p1;
   void *p2;
 ...
} my_object;

void func (my_object *me) {
 
 if(!_func(me)) {

   /* запускаем деструктор, его можно унести в отдельную ф-ю */
   if(me->p1) free(me->p1); /* и т.п. */
 }


bool _func(my_object *me) {
    

     me->p1 = malloc(...);

     /*бла бла бла */

    if(check) return false;


    /* бла бла бла */

    return true;
}

всё равно нано или поздно будешь освобождать ресурсы, так почему бы не иметь один деструктор на всего. Так, по крайней мере, друдно сделать утечку памяти.

mashina ★★★★★
()
Ответ на: комментарий от anonymous

Я подстраивался под содержимое кода ТСа. У него там и true, и false присутствуют. Сам никогда так не писал. «С детства» приучен, что «не ноль» - это true. :)

DeVliegendeHollander ★★
()
Ответ на: комментарий от ae1234

так лучше

func(){
    bool result=FALSE;
    .....
    p1=malloc();
    .....
    if(check) goto RE_1;
    .....
    .....
    p2=malloc();
    .....
    if(check) goto RE_0;
    .....
    result=TRUE;

RE_0:  free(p2);
RE_1:  free(p1);
    return result;
}

qaqa ★★
()
Ответ на: комментарий от anonymous

false и true - это с++ синтаксически верные константы. в с они могут быть define-ами и иметь свой сакральный смысл

ananas ★★★★★
()
Ответ на: комментарий от mashina

можно - но тогда деструктор должен точно знать или анализировать степень изменения состояния выполнения функций
если это не один обьект - а общая среда программы

ae1234 ★★
() автор топика
Ответ на: комментарий от ananas

а в чем принципиальное отличие от твоего примера, а то может я сонными глазами не вижу :) И где утечки там?

qaqa ★★
()
Ответ на: комментарий от ananas

это не фига не элегантное
откат состояния должен быть отдельным - смешивать его с нормальным ходом выполнения - ради одного ретурна - это чтот не то ...

ae1234 ★★
() автор топика
Ответ на: комментарий от anonymous

Странно. Достаточно часто встречается. Во всяком случае в моей практике в чужом коде видел десятки раз. Сам так предпочитаю не делать.

DeVliegendeHollander ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.