Опять про goto
От: Rackshas  
Дата: 14.07.06 06:49
Оценка: :))) :))
goto-ненавистники, как вот такой код
void HZ()
{
    if(!init1()) goto d1;
    if(!init2()) goto d2;
    if(!init3()) goto d3;

d3:
    destroy3();
d2:
    destroy2();
d1:
    destroy1();
}


Избавить от goto?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>

19.07.06 19:59: Перенесено модератором из 'Священные войны' — Kupaev
Re: Опять про goto
От: CreatorCray  
Дата: 14.07.06 06:56
Оценка: 2 (2)
Здравствуйте, Rackshas, Вы писали:

R>goto-ненавистники, как вот такой код

R>
R>void HZ()
R>{
R>    if(!init1()) goto d1;
R>    if(!init2()) goto d2;
R>    if(!init3()) goto d3;
    я так понимаю тут еще какой то код должен быть...
R>d3:
R>    destroy3();
R>d2:
R>    destroy2();
R>d1:
R>    destroy1();
R>}

R>


R>Избавить от goto?

Лехко!

void HZ()
{
    if (init1())
    {
        if(init2())
        {
            if(init3())
            {
                какой то код
            }
            destroy3();
        }
        destroy2();
    }
    destroy1();
}


или же для противников синтаксического оверхеда

void HZ()
{
    if (init1()) {
    if (init2()) {
    if (init3()) {
    
    какой то код
    
    }destroy3();
    }destroy2();
    }destroy1();
}
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Re: Опять про goto
От: DemAS http://demas.me
Дата: 14.07.06 06:57
Оценка: -1
Здравствуйте, Rackshas, Вы писали:

void HZ()
{
    if(!init2()) destroy2();
    if(!init3()) 
    {
       destroy3();
      destroy2();        
    }    
    destroy1();
}
... << RSDN@Home 1.2.0 alpha rev. 653>>
Re[2]: Опять про goto
От: DemAS http://demas.me
Дата: 14.07.06 06:59
Оценка: 1 (1)
Здравствуйте, DemAS, Вы писали:

Не правильно написал.
Сам уже вижу.
... << RSDN@Home 1.2.0 alpha rev. 653>>
Re: Опять про goto
От: Timurka Украина  
Дата: 14.07.06 07:10
Оценка:
Здравствуйте, Rackshas, Вы писали:

R>goto-ненавистники, как вот такой код

[skip]
R>Избавить от goto?

А зачем? Тебя устраивает как работает? — если да, то менять не надо. Хотя если этот код выполняет то, что я думаю (слишком мало информации) я бы написал так:
void HZ()
{
    if(init1())
    {
        if(init2())
        {
            init3();
            destroy3();
        }
        destroy2();
    }
    destroy1();
}


К тому же гораздо наглядней.
Re: Опять про goto
От: fsheet  
Дата: 14.07.06 07:11
Оценка: +1
Здравствуйте, Rackshas, Вы писали:

R>goto-ненавистники, как вот такой код

...

Вероятно правильно так:
void HZ()
{
    if(!init1()) goto d1;
    if(!init2()) goto d2;
    if(!init3()) goto d3;
// TODO: ...
    destroy3();
d3:
    destroy2();
d2:
    destroy1();
d1:
}


Вариант CreatorCray'а вполне:
void HZ()
{
    if(init1()) {
    if(init2()) {
    if(init3()) {
// TODO: ...
    destroy3();}
    destroy2();}
    destroy1();}
}
Re[2]: Опять про goto
От: Stepkh  
Дата: 14.07.06 09:20
Оценка:
Здравствуйте, Timurka, Вы писали:

T>Здравствуйте, Rackshas, Вы писали:


R>>goto-ненавистники, как вот такой код

T>[skip]
R>>Избавить от goto?

T>А зачем? Тебя устраивает как работает? — если да, то менять не надо. Хотя если этот код выполняет то, что я думаю (слишком мало информации) я бы написал так:

T>
T>void HZ()
T>{
T>    if(init1())
T>    {
T>        if(init2())
T>        {
T>            init3();
T>            destroy3();
T>        }
T>        destroy2();
T>    }
T>    destroy1();
T>}
T>


T>К тому же гораздо наглядней.


Хрен это а не наглядней. Если уровень вложенности будет больше трех — устанешь читать.
В данном случае, это мое сугубо имхо — такой подход доупустим на все 200%. Естествено мы полгаем, что это С. а не С++.

Если интресуют большие подробности, то могу показать код, где это применяется на полную катушку
(код указанный выше) — ралдости от его использования ни на грош
Re: Опять про goto
От: Кодт Россия  
Дата: 14.07.06 11:17
Оценка:
Здравствуйте, Rackshas, Вы писали:

R>goto-ненавистники, как вот такой код

R>void HZ()
R>{
R>    if(!init1()) goto d1;
R>    if(!init2()) goto d2;
R>    if(!init3()) goto d3;

R>d3:
R>    destroy3();
R>d2:
R>    destroy2();
R>d1:
R>    destroy1();
R>}

R>Избавить от goto?

На С++ это делается с помощью scope-guard'ов.
На С — можно наветвить условий. Кстати, если условий слишком много — не повод ли это задуматься о рефакторинге?
На ассемблере от goto вообще никуда не деться (что вы скажете, готоненавистники?) Хотя есть архитектуры, где деться можно — MIPS, кажется.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Перекуём баги на фичи!
Re[2]: Опять про goto
От: CreatorCray  
Дата: 14.07.06 11:23
Оценка: :)
Здравствуйте, Кодт, Вы писали:

К>На ассемблере от goto вообще никуда не деться (что вы скажете, готоненавистники?)

На асме нет гото. там jmp
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Re[3]: Опять про goto
От: Кодт Россия  
Дата: 14.07.06 11:26
Оценка: :))) :))) :))) :))) :)))
Здравствуйте, CreatorCray, Вы писали:

CC>На асме нет гото. там jmp


Намёк понял.
#define jmp goto

void HZ()
{
    if(!init1()) jmp d0;
    if(!init2()) jmp d1;
    if(!init3()) jmp d2;
    
d3:    destroy3();
d2: destroy2();
d1: destroy1();
d0: ;
}
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Перекуём баги на фичи!
Re: Опять про goto
От: WinterMute Россия http://yarrr.ru
Дата: 14.07.06 12:20
Оценка: -3 :)
void YaZnayu()
{
     int n = 2;

     if(!init1()) n = 0;
     else if(!init2()) n = 1;
     else if(!init3()) n = 2;

     switch(n)
     {
     case 2: destroy3();
     case 1: destroy2(); 
     case 0: destroy1();
     }
}

R>


Здравствуйте, Rackshas, Вы писали:

R>goto-ненавистники, как вот такой код

R>
R>void HZ()
R>{
R>    if(!init1()) goto d1;
R>    if(!init2()) goto d2;
R>    if(!init3()) goto d3;

R>d3:
R>    destroy3();
R>d2:
R>    destroy2();
R>d1:
R>    destroy1();
R>}

R>


R>Избавить от goto?
Re[2]: Опять про goto
От: Kluev  
Дата: 14.07.06 13:16
Оценка: -2 :)
Здравствуйте, CreatorCray, Вы писали:

R>>Избавить от goto?

CC>Лехко!

CC>
CC>void HZ()
CC>{
CC>    if (init1())
CC>    {
CC>        if(init2())
CC>        {
CC>            if(init3())
CC>            {
CC>                какой то код
CC>            }
CC>            destroy3();
CC>        }
CC>        destroy2();
CC>    }
CC>    destroy1();
CC>}
CC>


Или так:

void HZ()
{
    do
    {
        if( !init1() )
        {
            destroy1();
            break;
        }

        if( !init2() )
        {
            destroy2();
            break;
        }

        if( !init3() )
        {
            destroy3();
            break;
        }

    } while (0);

}
Re: Опять про goto
От: Кодт Россия  
Дата: 14.07.06 13:22
Оценка: 1 (1) -1
Здравствуйте, Rackshas, Вы писали:

Решение в стиле MIPS.
void HZ()
{
    bool ok1 = false, ok2 = false, ok3 = false; // можно заменить на один флаг типа int - тогда выражения будут громоздче

    true && ok1 = init1();
    ok1  && ok2 = init1();
    ok2  && ok3 = init1();
    
    ok3 && (todo(), true);
    
    ok3 && (done3(), true);
    ok2 && (done2(), true);
    ok1 && (done1(), true);
}
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Перекуём баги на фичи!
Re[3]: Опять про goto
От: CreatorCray  
Дата: 14.07.06 13:31
Оценка:
Здравствуйте, Kluev, Вы писали:

K>
K>void HZ()
K>{
K>    do
K>    {
K>        if( !init1() )
K>        {
K>            destroy1();
K>            break;
K>        }

K>        if( !init2() )
K>        {
K>            destroy2();
K>            break;
K>        }

K>        if( !init3() )
K>        {
K>            destroy3();
K>            break;
K>        }

K>    } while (0);

K>}
K>


Честно говоря — такой код просто кошмарно выглядит.
При этом код еще и неверен. Например при если init2 отработает неверно то должны вызваться destroy2 и destroy1...
+ еще нет вызовов destroyX в случае когда все initX отработали правильно.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Re: try-catch ?
От: игппук Беларусь  
Дата: 14.07.06 15:18
Оценка:
сабж.
проклятый антисутенерский закон
Re[2]: try-catch ?
От: CreatorCray  
Дата: 14.07.06 15:46
Оценка:
Здравствуйте, игппук, Вы писали:

И>try-catch?


Из пушки по воробьям?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Re[4]: Опять про goto
От: Kluev  
Дата: 14.07.06 17:35
Оценка:
Здравствуйте, CreatorCray, Вы писали:

CC>Здравствуйте, Kluev, Вы писали:


K>>
K>>void HZ()
K>>{
K>>    do
K>>    {
K>>        if( !init1() )
K>>        {
K>>            destroy1();
K>>            break;
K>>        }

K>>        if( !init2() )
K>>        {
K>>            destroy2();
K>>            break;
K>>        }

K>>        if( !init3() )
K>>        {
K>>            destroy3();
K>>            break;
K>>        }

K>>    } while (0);

K>>}
K>>


CC>Честно говоря — такой код просто кошмарно выглядит.

CC>При этом код еще и неверен. Например при если init2 отработает неверно то должны вызваться destroy2 и destroy1...
CC>+ еще нет вызовов destroyX в случае когда все initX отработали правильно.

Да, точно. Акелла промахнулся.
Re[5]: Опять про goto
От: Pyromancer  
Дата: 14.07.06 19:36
Оценка: :))) :)))
Нупы Учитесь...

void HZ(){
  int flag=0;
  flag+=init1()?1:0+init2()?2:0+init3()?4:0;
    switch(flag){
    case 7:
    case 6:
    case 5:
    case 4:destroy3();
    case 3:
    case 2:destroy2();
    case 1:destroy1();break;
    case 0://TODO...
  }
}
Re[6]: Опять про goto
От: Pyromancer  
Дата: 14.07.06 19:46
Оценка:
О! даже лучше придумал, чтоб и континуй воткнуть

void HZ(){
  int flag=0;
  for(int i=0;i<3;i++){
    if(flag) 
      continue;
    switch(i){
      0:flag+=init1()?1:0;break;
      1:flag+=init2()?2:0;break;
      2:flag+=init3()?4:0;break;
     }
  }
    switch(flag){
    case 7:
    case 6:
    case 5:
    case 4:destroy3();
    case 3:
    case 2:destroy2();
    case 1:destroy1();break;
    case 0://TODO...
  }
}
Re[7]: Опять про goto
От: CreatorCray  
Дата: 15.07.06 09:25
Оценка:
Здравствуйте, Pyromancer, Вы писали:

P>О! даже лучше придумал, чтоб и континуй воткнуть


Ну что? делаем конкурс: кто еще сильнее запутает приведенный кусок кода?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.