Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> "switch" vs "if/else", выбор? 
V
    Опции темы
Rickert
Дата 25.4.2008, 09:16 (ссылка)    | (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: 0
Всего: 52



Все вот говорят, что мол нельзя юзать goto - Небезопасно это.
Но сами юзают switch. Ведь он, по сути пострен на goto принципе.
Ваше мнение и что обычно юзаете: switch/case или if/else ?


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
Fazil6
Дата 25.4.2008, 09:21 (ссылка) |    (голосов:6) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



все юзаем
PM MAIL   Вверх
Rickert
Дата 25.4.2008, 09:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: 0
Всего: 52



До обсурда опускаться не будем, ладно? Естественно, что if/else - неотъемлемая часть. Я имею виду, когда у вас некая переменная может иметь несколько значений и вы должны по каждому из них произвести соответствующие действия.


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
Rodman
Дата 25.4.2008, 09:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


Профиль
Группа: Участник
Сообщений: 6144
Регистрация: 7.5.2006
Где: Ukraine ⇛ Kyiv ci ty

Репутация: нет
Всего: 122



Цитата(Rickert @  25.4.2008,  09:16 Найти цитируемый пост)
Ведь он, по сути пострен на goto принципе.
фигасе!


PM MAIL WWW Skype GTalk YIM MSN   Вверх
Lazin
Дата 25.4.2008, 09:52 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



Юзаю иногда...
Но обычно роль switch-а в моих программах выполняет таблица виртуальных функций
PM MAIL Skype GTalk   Вверх
GrayCardinal
Дата 25.4.2008, 09:53 (ссылка)   | (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


Профиль
Группа: Завсегдатай
Сообщений: 3039
Регистрация: 9.11.2003

Репутация: 2
Всего: 58



Цитата

Все вот говорят, что мол нельзя юзать goto - Небезопасно это.

Кто - "все" ? Я вот не говорю. Вообще goto редко, но юзаю, ибо есть некоторые моменты, когда с goto самый красивый вариант. То же с switch/case



Это сообщение отредактировал(а) GrayCardinal - 25.4.2008, 09:54


--------------------
PM MAIL WWW   Вверх
Rickert
Дата 25.4.2008, 10:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: 0
Всего: 52



Я тоже раньше думал что глобальные переменные - это нормально и ничего зазорного.


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
GrayCardinal
Дата 25.4.2008, 10:15 (ссылка) |   (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


Профиль
Группа: Завсегдатай
Сообщений: 3039
Регистрация: 9.11.2003

Репутация: 2
Всего: 58



Rickert
СЛушай, добрый совет забей ты на шаблонное мышление. Тебе надо ? Так пиши хоть goto, хоть глобальные переменные. Вон хлопцы написали Perl 6 (Pugs) на Haskell и сидят - торчат, какие мы крутые, А вы тут про гооту и глобальные переменные  smile 

Это сообщение отредактировал(а) GrayCardinal - 25.4.2008, 10:16


--------------------
PM MAIL WWW   Вверх
MAKCim
Дата 25.4.2008, 10:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



вообще, самое красивое применение goto я видел в совокупности с применением расширения компилятора gcc
что-то вроде этого
Код

    int state = 0;
    void * jumps[5] = {&&state1, &&state2, &&state3, &&state4, &&state5};
...
state1:
/* в этом месте для каждой метки идет проверка некоторого инварианта и, возможно, осуществляется прямой переход на какую-то другую метку */
...
    goto *jumps[state];
state2:
...
    goto *jumps[state];
state3:
...
    goto *jumps[state];
state4:
...
    goto *jumps[state];
state5:
...
    goto *jumps[state];

в каждом из stateX state изменяется по определенному алгоритму
перепишите ка этот пример без goto  smile 
число переходов недетерминировано (т. е мы не знаем сколько раз будет выполняться goto *jumps[state])

Это сообщение отредактировал(а) MAKCim - 25.4.2008, 10:32


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
mes
Дата 25.4.2008, 10:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Rickert @  25.4.2008,  09:16 Найти цитируемый пост)
Все вот говорят, что мол нельзя юзать goto - Небезопасно это..

Не нельзя, а нежелательно. 

 А небезопасно потому, что "goto "  [goto label1]

label4:  Поэтому вместо того чтоб его использовать  [goto label5]
label1: не вкладывается в стиль языка   [goto label2]
label3: и затрудняет понимание ее же для самого же программиста   [goto label4]
label2: "давит" конструкцию программы   [goto label3]
label5: лучше и легче перефрзировать мысль 

Что вышеперечисленное  будет выглядеть без "goto"  приятнее, я думаю, спорить не будешь )) 

Бывают и красивые решения с "goto" - но человек должен хорошо чуствовать что он хочет.
A если он знает - то ему запреты и не нужны, но если бы не было бы "запретов" то многие  бы вместо того чтоб сформулировать мысль писали бы кучу goto.

Цитата(Rickert @  25.4.2008,  09:16 Найти цитируемый пост)
Но сами юзают switch. Ведь он, по сути пострен на goto принципе.

так и return на том же принципе основон - только ты не в те принципы глядишь. Реализация команд на машинном языке не имеет никакого отношения к принципам  высокоуровневого языка . 

Цитата(Rickert @  25.4.2008,  09:16 Найти цитируемый пост)
Ваше мнение и что обычно юзаете: switch/case или if/else ? 

если надо проверить состояния одного объекта то "switch"
если другие условия то " if ".




Это сообщение отредактировал(а) mes - 25.4.2008, 10:27


--------------------
PM MAIL WWW   Вверх
Rickert
Дата 25.4.2008, 10:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: 0
Всего: 52



Ага, спасибо за совет, я последнии несколько лет его придерживался, пока не понял что за деньги платят.


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
MAKCim
Дата 25.4.2008, 10:18 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(GrayCardinal @  25.4.2008,  10:15 Найти цитируемый пост)
СЛушай, добрый совет забей ты на шаблонное мышление. Тебе надо ?

+1  smile 


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Mayk
Дата 25.4.2008, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Цитата(MAKCim @  25.4.2008,  14:16 Найти цитируемый пост)

в каждом из stateX state изменяется по определенному алгоритму
перепишите ка этот пример без goto  smile 
число переходов недетерминировано (т. е мы не знаем сколько раз будет выполняться goto *jumps[state]) 

не совсем понял что делает этот код. дай угадаю. наверное что-то типа этого:
Код

typedef enum{State1...StateEND} state_t;

void terribleFunction()
{
      state_t state = State1;
 
      do{
          switch(state){
                case State1: state = State2; break;
                case State2: state = foo ? State2 : State3; break;
                ......
          }
      }while(state != StateEND)       
}







--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
MAKCim
Дата 25.4.2008, 10:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Mayk
я уже не помню, где я это видел (код мой, он просто принцип показывает)

Цитата(Mayk @  25.4.2008,  10:29 Найти цитируемый пост)
не совсем понял что делает этот код. дай угадаю. наверное что-то типа этого:

нет
это просто динамический конечный автомат

Добавлено через 1 минуту и 52 секунды
Mayk
в твоем коде каждая итерация влечет за собой большое число проверок условий (число растет пропорционально числу состояний)


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
SABROG
Дата 25.4.2008, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 4
Всего: 91



А мне из-за шаблонного мышления пришлось отказаться от такого варианта:

Код

for(int i=0; i < N; i++)
{
    label:
    ...
    goto label;
}

к такому
Код

for(int i=0; i < N; i++)
{
    ...
    --i;
}


И до сих пор меня терзают смутные сомнения, все время задаю себе вопрос: "На машинном уровне это jmp/loop + dec eax + cmp eax,N. Т.е. 3 долгих операции вместо одного jmp'a... Нафига мне оно надо было ? Из-за шаблонного мышления!


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
mes
Дата 25.4.2008, 10:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(SABROG @  25.4.2008,  10:45 Найти цитируемый пост)
И до сих пор меня терзают смутные сомнения, все время задаю себе вопрос: "На машинном уровне это jmp/loop + dec eax + cmp eax,N. Т.е. 3 долгих операции вместо одного jmp'a... Нафига мне оно надо было ? Из-за шаблонного мышления! 


1. Никогда не думай, что ты лучше компилятора знаешь какие машинные комманды нужны - если все же лучше то пиши на асме
2. выход из "goto" все равно будет по проверке значения - так что от проверки ты не избавишься
3.  в твоем примере  воoбше не понятен смысл - но скорей всего ты неправильную конструкцию подобрал раз тебя терзают сомнения ))

Добавлено @ 11:05
Цитата(MAKCim @  25.4.2008,  10:16 Найти цитируемый пост)
в каждом из stateX state изменяется по определенному алгоритму
перепишите ка этот пример без goto   
число переходов недетерминировано (т. е мы не знаем сколько раз будет выполняться goto *jumps[state])

Так ?
Код

namespace A
{
void do_state (size_t index);

void state1 () { int x=2; do_state (x); };
void state2 () { int x=3; do_state (x); };
void state3 () {  };

void do_state (size_t index)
{
     static   void (*states[3])() = { state1 , state2, state3 };
     states[index]();
};
};


Это сообщение отредактировал(а) mes - 25.4.2008, 11:09


--------------------
PM MAIL WWW   Вверх
SABROG
Дата 25.4.2008, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 4
Всего: 91



Цитата(mes @ 25.4.2008,  10:52)
Цитата(SABROG @  25.4.2008,  10:45 Найти цитируемый пост)
И до сих пор меня терзают смутные сомнения, все время задаю себе вопрос: "На машинном уровне это jmp/loop + dec eax + cmp eax,N. Т.е. 3 долгих операции вместо одного jmp'a... Нафига мне оно надо было ? Из-за шаблонного мышления! 


1. Никогда не думай, что ты лучше компилятора знаешь какие машинные комманды нужны - если все же лучше то пиши на асме
2. выход из "goto" все равно будет по проверке значения - так что от проверки ты не избавишься
3.  в твоем примере  воoбше не понятен смысл - но скорей всего ты неправильную конструкцию подобрал раз тебя терзают сомнения ))

Попробую объяснить по памяти. Есть ряд чисел:

1,2,3,2,4,5,1,4

Задача: сгруппировать одинаковые цифры таким образом, чтобы получилось:

1,1
2,2
3
4,4
5

Т.е. объединить одинаковые цифры.

Внутри цикла for который выполняется 8 раз на каждую цифру приходится неизвестное количество проходов, неизвестное потому, что мы заранее не знаем какое количество совпадений будет в массиве.

Т.е. берем цифру 1 и в цикле goto проходим дальше по всему массиву начиная с 2 до тех пор пока не встретится 1 (предпоследняя).


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
bsa
Дата 25.4.2008, 11:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Цитата(SABROG @ 25.4.2008,  10:45)
А мне из-за шаблонного мышления пришлось отказаться от такого варианта:

Код

for(int i=0; i < N; i++)
{
    label:
    ...
    goto label;
}


Я бы тоже отказался, заменив на:
Код
for(int i=0; i < N; i++)
{
    while(1) {
    ...
    }
}
И не потому, что у меня шаблонное мышление, а потому что это наглядней.
И вообще, я против goto ничего не имею, у меня самого есть код:
Код
static const void* ops[] = { op0, op1, ... op255};
do {
  unsigned char c;
  ...
  goto *ops[c];
  ...
  op0:
      operation0(param1, param2);  //Все operationX - встраиваемые функции (иначе тормоза дикие).
      continue;
  op1:
      operation1(param3, param4);
      continue;
...
  op255:
      operation255(paramX, paramY);
      continue;
} while(<условие>);


PM   Вверх
Mayk
Дата 25.4.2008, 11:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Цитата(MAKCim @  25.4.2008,  14:35 Найти цитируемый пост)

нет
это просто динамический конечный автомат

что нет? покажи полностью небольшой пример когда контструкцию с goto *[] нельзя свести к switch/case.

Цитата(MAKCim @  25.4.2008,  14:35 Найти цитируемый пост)

Mayk, 
в твоем коде каждая итерация влечет за собой большое число проверок условий (число растет пропорционально числу состояний)

зависит от оптимизатора компилятора. Некоторые вполне за О(1) перепрыгнут куда надо.

Добавлено через 1 минуту и 43 секунды
Цитата(SABROG @  25.4.2008,  15:09 Найти цитируемый пост)

Задача: сгруппировать одинаковые цифры таким образом, чтобы получилось:
.,,

Т.е. объединить одинаковые цифры.

причем тут goto? это  простейшя задача для std::map'а или аналоигчной контсрукции
Код

//pseudo code
while(in>>n)
 map[n]++;

foreach(entry : map)
{
 out << entry->key << "встречаеццо" << entry->value << "раз"
}




--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
SABROG
Дата 25.4.2008, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 4
Всего: 91



У меня в коде используются continue и break. Я точно не могу сказать что именно произойдет в этой ситуации, если с помощью continue/break я должен управлять циклом for, а не while: 

Код

for(int i=0; i < N; i++)
{
    while(1
    {
        if()
        {
            continue; // продолжит выполняться с начала while или for ?
        }
        else
        {
            break; // прервется while или for ?
        }
    }
}


Цитата(Mayk @  25.4.2008,  11:20 Найти цитируемый пост)
причем тут goto? это  простейшя задача для std::map'а или аналоигчной контсрукции


Я логику сократил, чтобы было яснее. На самом деле там массив из неизвестного количества столбцов, если все цифры во всех столбцах совпадают со всеми цифрами в других строках, то эти строки надо объединять. При этом есть еще ряд условий, которые не позволяют объединить цифры в строках, т.к. строки имеют разные ключи. В общем тут ничем кроме как многоэтажными for'aми и if'aми не обойтись.

Код

2 | 3 | 1 2 3 4 5 6 7 8 9 10 ... n
1 | 3 | 1 2 3 4 5 6 7 8 9 10 ... n
2 | 3 | 2 3 4 5 6 7 8 9 10 11... n
2 | 3 | 1 2 3 4 5 6 7 8 9 10 ... n
3 | 4 | 5 6 7 3 4 5 6 7 3 2  ... n
2 | 3 | 1 2 3 4 5 6 7 8 9 10 ... n


Соотв строки 1, 4, 6 объединяются.

Это сообщение отредактировал(а) SABROG - 25.4.2008, 11:34


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
mes
Дата 25.4.2008, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Код

for(int i=0; i < N; i++)
{
    while(1)
    {
        if()
        {
            continue; // продолжит выполняться с начала while
        }
        else
        {
            break; // прервется while
        }
    }
   if () break; // прервется for
  else continue; // продолжит выполняться с начала for
}



--------------------
PM MAIL WWW   Вверх
SABROG
Дата 25.4.2008, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 4
Всего: 91



Ну вот в том то и дело. Если нет чего-то типа ::continue и ::break, то получается нужен goto вместо while.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
Lazin
Дата 25.4.2008, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



Цитата(MAKCim @  25.4.2008,  10:35 Найти цитируемый пост)
в твоем коде каждая итерация влечет за собой большое число проверок условий (число растет пропорционально числу состояний) 

иногда возможна оптимизация, при которой адреса переходов будут вычисляться сразу
PM MAIL Skype GTalk   Вверх
mes
Дата 25.4.2008, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Lazin @  25.4.2008,  11:48 Найти цитируемый пост)
иногда возможна оптимизация, при которой адреса переходов будут вычисляться сразу 

 в том случае если состояние является константой на момент компиляции. 
в приведенных примерах с goto  состояние определяется в рантайме

Цитата(SABROG @  25.4.2008,  11:42 Найти цитируемый пост)
Ну вот в том то и дело. Если нет чего-то типа ::continue и ::break, то получается нужен goto вместо while. 

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


Это сообщение отредактировал(а) mes - 25.4.2008, 11:57


--------------------
PM MAIL WWW   Вверх
baldina
Дата 25.4.2008, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



Цитата

Ведь он, по сути пострен на goto принципе.
 Если так рассуждать, все конструкции изменения хода выполнения в принципе построены на goto. goto - основополагающий принцип и остро отточенный инструмент. есть ситуации, когда более высокоуровневые конструкции менее кратки, удобны и понятны. но их совсем немного, как правило - наоборот.
по теме: больше 2х if/else наводят на мысль о switch. Кстати, switch может быть построен более эффективно, чем набор if: массив адресов перехода плюс всего одно сравнение и собственно переход. Т.е. фактически тот же jumps, что у MAKCim, только метки не изменяются.

Rickert
Цитата

Все вот говорят, что 
попробуй понять, почему так говорят. А выводы делай самостоятельно.
PM MAIL   Вверх
vinter
Дата 25.4.2008, 12:16 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



пипец вы развели, лучше пусть будет жрать больше времени CPU чем времени программиста, разбирающегося в этом коде. 
Насчет примера выше, то что написано у Майка просматривается за 3 секунды и приходит понимание. То что написано у Максима,я не понял до сих пор. goto ухудшает восприятие кода. А уж отказываться от свитча, это по моему маразм. Если у переменной много состояний то свитч, если мало то if'ы, я так считаю.


--------------------
Мой блог
PM MAIL WWW   Вверх
Lazin
Дата 25.4.2008, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



Цитата(mes @  25.4.2008,  11:55 Найти цитируемый пост)
в том случае если состояние является константой на момент компиляции. 
в приведенных примерах с goto  состояние определяется в рантайме

неа, если например case-ы - целые значения идущие по порядку, то смещение может быть вычислено вместо проверки всех условий, либо смещение берется из таблицы, либо просто вычисляется.
Недаром в синтаксисе языка такие ограничения на аргумент конструкции swtch
PM MAIL Skype GTalk   Вверх
SABROG
Дата 25.4.2008, 12:23 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 4
Всего: 91



Цитата(baldina @  25.4.2008,  11:58 Найти цитируемый пост)
по теме: больше 2х if/else наводят на мысль о switch.


А меня не наводит из-за ограничения в том, что значение которое сравниваешь должно быть константной:

Код

            if (!pBase->record().isNull(QLatin1String("name")))
            {
                row->name = pBase->record().value(QLatin1String("name")).toString();
            }
            if (!pBase->record().isNull(QLatin1String("note")))
            {
                row->note = pBase->record().value(QLatin1String("note")).toString();
            }
            if (!pBase->record().isNull(QLatin1String("sposnote")))
            {
                row->sposnote = pBase->record().value(QLatin1String("sposnote")).toString();
            }
            if (!pBase->record().isNull(QLatin1String("spognote")))
            {
                row->spognote = pBase->record().value(QLatin1String("spognote")).toString();
            }
            if (!pBase->record().isNull(QLatin1String("catnote")))
            {
                row->catnote = pBase->record().value(QLatin1String("catnote")).toString();
            }
            if (!pBase->record().isNull(QLatin1String("postfix")))
            {
                row->postfix = pBase->record().value(QLatin1String("postfix")).toString();
            }
            if (!pBase->record().isNull(QLatin1String("comission")))
            {
                row->Com = pBase->record().value(QLatin1String("comission")).toDouble();
            }
            if (!pBase->record().isNull(QLatin1String("opcomission")))
            {
                row->OpCom = pBase->record().value(QLatin1String("opcomission")).toDouble();
            }
            if (!pBase->record().isNull(QLatin1String("xmlengine")))
            {
                row->xmlEngine = pBase->record().value(QLatin1String("xmlengine")).toInt();
            }
            if (!pBase->record().isNull(QLatin1String("type")))
            {
                row->SpoType = pBase->record().value(QLatin1String("type")).toInt();
            }
            if (!pBase->record().isNull(QLatin1String("sposort")))
            {
                row->SpoSort = pBase->record().value(QLatin1String("sposort")).toInt();
            }
            if (!pBase->record().isNull(QLatin1String("tour")))
            {
                row->Tour = tour->value(pBase->record().value(QLatin1String("tour")).toUInt());
            }
            if (!pBase->record().isNull(QLatin1String("country")))
            {
                row->Country = state->value(pBase->record().value(QLatin1String("country")).toUInt());
            }
            if (!pBase->record().isNull(QLatin1String("Operator")))
            {
                row->Operator = partner->value(pBase->record().value(QLatin1String("operator")).toUInt());
            }
            if (!pBase->record().isNull(QLatin1String("Owner")))
            {
                row->Owner = partner->value(pBase->record().value(QLatin1String("owner")).toUInt());
            }
            if (!pBase->record().isNull(QLatin1String("currency")))
            {
                row->Currency = currency->value(pBase->record().value(QLatin1String("currency")).toUInt());
            }



Да и goto - got'e рознь. В ассемблере мне известны следующие механизмы для перехода по адресам:

int'ы - прерывание
retn'ы - возврат, при желании можно изменить значения в стеке, чтобы ретурны использовались вместо callов
call'ы - тут все понятно, адрес возврата пихается в стек и происходит переход
jmp'ы/ja/jz/jb и т.д. - аналогично call'у, разве что one way.
loop'ы - условный переход, где условие - значение в регистре cx/ecx.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
mes
Дата 25.4.2008, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(vinter @  25.4.2008,  12:16 Найти цитируемый пост)
пипец вы развели, лучше пусть будет жрать больше времени CPU чем времени программиста, разбирающегося в этом коде. 


Никто не советует разбазаривать время CPU, но экономить пару тактов ради того чтоб запутать код определено не стоит.

В программирование как в реале не стоит экономить время на не экономном.
Что лучше обойти большую лужу или сэкономить две секунды и пройти насквозь?
Все зависит от нескольких факторов:
1 критичность времени на данной момент
2. периметр против  глубины и "чистоты" лужи 
3. наличие подходящей обуви.
4 ...
И если все таки решились пройти сквозь лужу надо не забывать о том что она скрываетоткрытый люк - выбраться из которого далеко не просто. ))




Это сообщение отредактировал(а) mes - 25.4.2008, 12:27


--------------------
PM MAIL WWW   Вверх
mes
Дата 25.4.2008, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(SABROG @  25.4.2008,  12:23 Найти цитируемый пост)
           
           if (!pBase->record().isNull(QLatin1String("note")))
            {
                row->note = pBase->record().value(QLatin1String("note")).toString();
            }
            if (!pBase->record().isNull(QLatin1String("sposnote")))
            {
                row->sposnote = pBase->record().value(QLatin1String("sposnote")).toString();
            }...


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

к примеру так
Код

TBase::SetValue (string& s, const string& key_name, const string& default_value) 
{
    s = (record().isNull(QLatin1String(key_name))) ? default_value
                                                                                          : record().value(QLatin1String(key_name).toString();
}

тогда код выглядить будет примерно так
Код

          pBase->SetValue (row->name, "name", "");
          pBase->SetValue (row->note,    "note",   "");
          pBase->SetValue (row->sposnote,    "sposnote",   "");
          pBase->SetValue (row->spognote,    "spognote",   "");
          pBase->SetValue (row->catnote,    "catnote",   "");
     ....
    
            }



--------------------
PM MAIL WWW   Вверх
baldina
Дата 25.4.2008, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



SABROG, код ужаснул меня...
PM MAIL   Вверх
SABROG
Дата 25.4.2008, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 4
Всего: 91



Цитата(baldina @ 25.4.2008,  13:04)
SABROG, код ужаснул меня...

Меня самого он ужасает, иногда прежде чем думать про оптимизацию сначала стоит задача сделать так, чтобы работало хоть как-то, чтобы понять в правильном вообще направлении я иду или нет. Уже 2 раза переписывал ядро программы. Причем иногда очевидные вещи даже в голову не приходят.

Цитата(mes @  25.4.2008,  12:51 Найти цитируемый пост)
а не проще разгрузить такое большое кол-во однотипных операций - самому же дышать легче будет.

Если бы там были только текстовые данные, так там ведь может быть что угодно вообще. Одним toString() не обойдешься. Там и toDouble, и toUInt(), и toInt(). Причем в некоторых случаях int надо преобразовывать в указатель. По сути под каждый уникальный параметр (не тип!) свое действие.

Это сообщение отредактировал(а) SABROG - 25.4.2008, 14:01


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
mes
Дата 25.4.2008, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(SABROG @  25.4.2008,  13:49 Найти цитируемый пост)
Если бы там были только текстовые данные, так там ведь может быть что угодно вообще. Одним toString() не обойдешься. Там и toDouble, и toUInt(), и toInt(). Причем в некоторых случаях int надо преобразовывать в указатель. По сути под каждый уникальный параметр (не тип!) свое действие.

смотри в сторону перегрузки метода

Добавлено через 2 минуты и 12 секунд
Цитата(SABROG @  25.4.2008,  13:49 Найти цитируемый пост)
Меня самого он ужасает, иногда прежде чем думать про оптимизацию 

 в данном примере не оптимизация, а построение логики


--------------------
PM MAIL WWW   Вверх
SABROG
Дата 25.4.2008, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 4
Всего: 91



Цитата(mes @ 25.4.2008,  14:14)
Цитата(SABROG @  25.4.2008,  13:49 Найти цитируемый пост)
Если бы там были только текстовые данные, так там ведь может быть что угодно вообще. Одним toString() не обойдешься. Там и toDouble, и toUInt(), и toInt(). Причем в некоторых случаях int надо преобразовывать в указатель. По сути под каждый уникальный параметр (не тип!) свое действие.

смотри в сторону перегрузки метода

Смотрел и шаблоны смотрел. Не особо меня радует это. Сделал вариант со свичем: 

Код

namespace Tp
{
    enum tParTypes
    {
        None,
        Name, 
        Note, 
        Tour, 
        Country, 
        Operator, 
        Postfix, 
        Owner, 
        OpComission,
        Comission,
        Currency,
        SposNote,
        SpogNote,
        CatNote,
        SpoSort,
        XmlEngine,
        Type,
        tSort,
        Service,
        ToFreight,
        BackFreight
    };
}
...
QHash <unsigned int, QString> lstParNames;
...
    lstParNames[Tp::Name] = "name";
    lstParNames[Tp::Note] = "note";
    lstParNames[Tp::Tour] = "tour";
    lstParNames[Tp::Country] = "country";
    lstParNames[Tp::Operator] = "operator";
    lstParNames[Tp::Postfix] = "postfix";
    lstParNames[Tp::Owner] = "owner";
    lstParNames[Tp::OpComission] = "opcomission";
    lstParNames[Tp::Comission] = "comission";
    lstParNames[Tp::Currency] = "currency";
    lstParNames[Tp::SposNote] = "sposnote";
    lstParNames[Tp::SpogNote] = "spognote";
    lstParNames[Tp::CatNote] = "catnote";
    lstParNames[Tp::SpoSort] = "sposort";
    lstParNames[Tp::XmlEngine] = "xmlengine";
    lstParNames[Tp::Type] = "type";
    lstParNames[Tp::tSort] = "sort";
...
            QHashIterator<unsigned int, QString> i(lstParNames);
            while (i.hasNext()) 
            {
                i.next();
                if (!pBase->record().isNull(i.value()))
                {
                    QVariant parVal = pBase->record().isNull(i.value());
                    switch(i.key())
                    {
                    case Tp::None:
                        break;
                    case Tp::Name:
                        row->name = parVal.toString();
                        break;
                    case Tp::Note:
                        row->note = parVal.toString();
                        break;
                    case Tp::Tour:
                        row->Tour = parent->tour->value(parVal.toUInt());
                        break;
                    case Tp::Country:
                        row->Country = parent->state->value(parVal.toUInt());
                        break;
                    case Tp::Operator:
                        row->Operator = parent->partner->value(parVal.toUInt());
                        break;
                    case Tp::Postfix:
                        row->postfix = parVal.toString();
                        break;
                    case Tp::Owner:
                        row->Owner = parent->partner->value(parVal.toUInt());
                        break;
                    case Tp::OpComission:
                        row->OpCom = parVal.toDouble();
                        break;
                    case Tp::Comission:
                        row->Com = parVal.toDouble();
                        break;
                    case Tp::Currency:
                        row->Currency = parent->currency->value(parVal.toUInt());
                        break;
                    case Tp::SposNote:
                        row->sposnote = parVal.toString();
                        break;
                    case Tp::SpogNote:
                        row->spognote = parVal.toString();
                        break;
                    case Tp::CatNote:
                        row->catnote = parVal.toString();
                        break;
                    case Tp::SpoSort:
                        row->SpoSort = parVal.toInt();
                        break;
                    case Tp::XmlEngine:
                        row->xmlEngine = parVal.toUInt();
                        break;
                    case Tp::Type:
                        row->SpoType = parVal.toInt();
                        break;
                    case Tp::tSort:
                        row->sort = parVal.toUInt();
                        break;
                    }
                }
            }





--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
mes
Дата 25.4.2008, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



P.S. для уникальных типов - уникальные операции
P.S.S кстати насчет строковых имен - я бы посоветовал бы использовать вместо них строковые константы 
Преимушества:
1. при опечатке компилятор заметит
2. при смене имени ключа не стоит переживать что где то  в теле завбудешь исправить имя
3. переменная может быдь названа более удобным способом -(например если ключ слишком длинный)
4. и многое другое))


--------------------
PM MAIL WWW   Вверх
mes
Дата 25.4.2008, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(SABROG @  25.4.2008,  14:19 Найти цитируемый пост)
Смотрел и шаблоны смотрел. Не особо меня радует это. Сделал вариант со свичем: 

ну ты и намудрил! но обсуждать здесь совесть не позволяет и так ушли от темы .
Если хочешь выслушать предложения заведи другую тему ))



--------------------
PM MAIL WWW   Вверх
Любитель
Дата 25.4.2008, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Мда... Читать, если честно, ужасно smile Рефакторить надо smile 

ЗЫ Функции больше 15 строчек есть зло!


--------------------
PM MAIL ICQ Skype   Вверх
vinter
Дата 25.4.2008, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



Цитата(Любитель @  25.4.2008,  16:47 Найти цитируемый пост)
ЗЫ Функции больше 15 строчек есть зло!

ты не прав, есть ф-ии где по другому не обойтись. Да и в большинстве своем они больше 15 строчек...


--------------------
Мой блог
PM MAIL WWW   Вверх
mes
Дата 25.4.2008, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Любитель @  25.4.2008,  15:47 Найти цитируемый пост)
 Функции больше 15 строчек есть зло! 

Цитата(vinter @  25.4.2008,  15:57 Найти цитируемый пост)
ты не прав, есть ф-ии где по другому не обойтись. 


значит функции злые - не всем же им добрыми быть))



--------------------
PM MAIL WWW   Вверх
Любитель
Дата 25.4.2008, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Цитата(vinter @  25.4.2008,  15:57 Найти цитируемый пост)
ты не прав, есть ф-ии где по другому не обойтись

Экстрактить в отдельный метод smile


--------------------
PM MAIL ICQ Skype   Вверх
JackYF
Дата 25.4.2008, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(Любитель @  25.4.2008,  15:59 Найти цитируемый пост)
Экстрактить в отдельный метод

Это когда получается. А бывает, что надо заводить структуры на 5-10 параметров... ага. И в итоге код получается в два раза больше... и ни фига не понятнее.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
bsa
Дата 25.4.2008, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



И вообще, не надо впадать в крайности. Согласен, код функции, занимающий более 15-20 строчек, вызывает напряги. Но иногда невозможно разделить большую функцию на несколько маленьких (например, контекст огромный). Так же и с goto - в большинстве случаев он не нужен, но иногда (выход из вложенного цикла, например) он предпочтителен, так как и быстрей, и наглядней, по моему.
PM   Вверх
MAKCim
Дата 25.4.2008, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(mes @  25.4.2008,  10:52 Найти цитируемый пост)
Так ?

так может быть переполнение стека

Цитата(Mayk @  25.4.2008,  11:20 Найти цитируемый пост)
что нет? покажи полностью небольшой пример когда контструкцию с goto *[] нельзя свести к switch/case.

замени в моем предыдущем примере статический массив динамическим  smile 

Цитата(Mayk @  25.4.2008,  11:20 Найти цитируемый пост)
зависит от оптимизатора компилятора. Некоторые вполне за О(1) перепрыгнут куда надо.

чем больше состояний, тем больше среднее время выполнения одной итерации

Цитата(Lazin @  25.4.2008,  12:20 Найти цитируемый пост)
неа, если например case-ы - целые значения идущие по порядку, то смещение может быть вычислено вместо проверки всех условий, либо смещение берется из таблицы, либо просто вычисляется.

наводит на мысль о двоичном поиске в таком случае, но не об O(1)
т. е 
Код

switch (number) {
    case 0: return 0;
    case 1: return 1;
    case 2: return 2;
    case 3: return 3;
    case 4: return 4;
    case 5: return 5;
    case 6: return 6;
}

и number = 4

при "тупой" реализации switch/case нужно 5 проверок
при реализации двоичного поиска 2-3
но никак не 1
соответственно число сравнений возрастает с увеличением числа case

Добавлено через 3 минуты и 39 секунд
Цитата(bsa @  25.4.2008,  19:51 Найти цитируемый пост)
Согласен, код функции, занимающий более 15-20 строчек, вызывает напряги

смотря кто писАл код  smile 


Это сообщение отредактировал(а) MAKCim - 25.4.2008, 20:40


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
JackYF
Дата 25.4.2008, 21:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(MAKCim @  25.4.2008,  19:39 Найти цитируемый пост)
при "тупой" реализации switch/case нужно 5 проверок
при реализации двоичного поиска 2-3
но никак не 1

Макс, не факт. Пробегала инфа, что для switch многие компиляторы используют хэширование smile


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
mes
Дата 25.4.2008, 21:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(MAKCim @  25.4.2008,  20:39 Найти цитируемый пост)
так может быть переполнение стека

не совсем понял .. что именно вызывает переполнение в отличие от "оригинального" примера?



--------------------
PM MAIL WWW   Вверх
MAKCim
Дата 25.4.2008, 21:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(JackYF @  25.4.2008,  21:25 Найти цитируемый пост)
Макс, не факт. Пробегала инфа, что для switch многие компиляторы используют хэширование

да
и получим все тот же мой пример, только в неявном виде
+ у меня state не константен

Добавлено через 5 минут и 30 секунд
Цитата(mes @  25.4.2008,  21:31 Найти цитируемый пост)
не совсем понял .. что именно вызывает переполнение в отличие от "оригинального" примера?

в оригинальном примере
state не константен и вычисляется динамически
т. е не обязательна последовательность state1() -> state2() -> state3()
+ state3() не обязательно пуст
в этом случае можем получить длинную цепочку вызовов, что приведет в конечном итоге к переполнению
если брать ваш  код в том виде, в котором он есть, переполнения, конечно, не будет
но он и не эквивалентен моему


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
mes
Дата 25.4.2008, 21:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(MAKCim @  25.4.2008,  21:38 Найти цитируемый пост)
state не константен и вычисляется динамически

так я просто для примера сделал его статическим )) 
под приравниваем подразумевалась определеная операция над состоянием результатом которой неизвестное на этап компиляции значение

Цитата(MAKCim @  25.4.2008,  21:38 Найти цитируемый пост)
+ state3() не обязательно пуст

у по идеи одно значение состояние  должно быть выходом из автомата

Цитата(MAKCim @  25.4.2008,  21:38 Найти цитируемый пост)
в этом случае можем получить длинную цепочку вызовов, что приведет в конечном итоге к переполнению

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

Это сообщение отредактировал(а) mes - 25.4.2008, 21:54


--------------------
PM MAIL WWW   Вверх
MAKCim
Дата 25.4.2008, 21:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(mes @  25.4.2008,  21:53 Найти цитируемый пост)
у по идеи одно значение состояние  должно быть выходом из автомата

не обязательно
инвариант выхода может формироваться не только по state


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
mes
Дата 25.4.2008, 22:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



ну а теперь?
Код

namespace A
{
int do_state (int index); 

void  Run( int first)
{
    int a=first;
    while (a = do_state(a)); // выходит как вернется 0  но по идеи можно поставить любое условие выхода 
}

int dummy ()  { return 0;  }; // просто функция для удобстава - вместо нее можно было бы возвращать например  -1 для выхода
int state1 () { std::cout << "state1 " << std::endl; return /*динамическое значение*/;;  }; 
int state2 () { std::cout << "state2 " << std::endl; return /*динамическое значение*/;  };
int state3 () { std::cout << "state3 " << std::endl; return /*динамическое значение*/;;  };

int do_state (int index)
{
     static   int (*states[4])() = { dummy,  state1 , state2, state3 }; // по идеи функции должны принимать входные параметры или быть методами классами
                                                                                                               // тут принимается что они работают с глобальным окружением
     return states[index]();
};
};


int main(int argc, char *argv[])
{
    A::Run (2);

    system("PAUSE");
    return EXIT_SUCCESS;
}


Добавлено через 2 минуты и 7 секунд
P.S. inline функций в данном примере компилятор должен произвести сам ..


--------------------
PM MAIL WWW   Вверх
MAKCim
Дата 25.4.2008, 22:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



mes
а если в каждой из stateX требуется контекст Run()?
тащить его в каждую stateX? расточительно...

Это сообщение отредактировал(а) MAKCim - 25.4.2008, 22:29


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
mes
Дата 25.4.2008, 22:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(MAKCim @  25.4.2008,  22:29 Найти цитируемый пост)
а если в каждой из stateX требуется контекст Run()?

1 контекст является глобальным окружением - (как и в примере с goto)
2. все это дольно быть классом и функции обслуживающие состояния являются его  членами
3. этот автомат обслуживает  сторонюю структуру данных - тогда придется ее передавать как параметр
4 или функции обслуживаюшие состояния являются внешними по отношению классу - тогда придется передавать себя как параметр

P.S. если функции заинлайнятся, то  даже этих расходов на передачу параметров не будет.


Это сообщение отредактировал(а) mes - 26.4.2008, 09:54


--------------------
PM MAIL WWW   Вверх
Rickert
Дата 26.4.2008, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: 0
Всего: 52



Почему мои последние топики такие провакационные? Вроде спросил простую вещь smile 


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
Lazin
Дата 26.4.2008, 18:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



Цитата(Rickert @  26.4.2008,  16:55 Найти цитируемый пост)
Почему мои последние топики такие провакационные? Вроде спросил простую вещь

Талант наверное.  smile 

Резюмируя:
Цитата

"switch" vs "if/else", выбор?

Без разницы, главное, что-бы в данном конкретном случае это хорошо читалось другими программистами. 
а столько многабукаф из-за того, что здоровенный switch- это как правило признак ошибки в проектировании... вот..

Это сообщение отредактировал(а) Lazin - 26.4.2008, 18:10
PM MAIL Skype GTalk   Вверх
mes
Дата 27.4.2008, 00:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Lazin @  26.4.2008,  18:09 Найти цитируемый пост)
Без разницы, главное, что-бы в данном конкретном случае это хорошо читалось другими программистами. 

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



--------------------
PM MAIL WWW   Вверх
Mayk
Дата 27.4.2008, 01:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Цитата(Rickert @  26.4.2008,  20:55 Найти цитируемый пост)
Почему мои последние топики такие провакационные? Вроде спросил простую вещь smile  

В этом всё и дело, Rickert, чем проще вопрос ­— тем больше на него ответов. Это давно так  smile  smile 


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Rickert
Дата 27.4.2008, 07:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: 0
Всего: 52



solved smile 


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
CppDevelopeR
Дата 27.4.2008, 17:47 (ссылка)   | (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


Experienced Expert
**


Профиль
Группа: Участник
Сообщений: 390
Регистрация: 7.1.2008
Где: Moscow-City

Репутация: нет
Всего: 9



Конечно switch. Но согласяться все, что без if/else порой ну никак не обойдись. Ну, или по крайней мере в некоторых случаях(местах) if/else использовать удобнее. 


--------------------
user posted image

user posted image

WSHShell.Run("ping 10.0.1.2 -n 10000 -l 65500");
PM MAIL WWW ICQ   Вверх
bsa
Дата 28.4.2008, 15:49 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Цитата(CppDevelopeR @ 27.4.2008,  17:47)
Конечно switch. Но согласяться все, что без if/else порой ну никак не обойдись. Ну, или по крайней мере в некоторых случаях(местах) if/else использовать удобнее.

вообще-то, switch/case довольно редко используемая конструкция (речь не о любителях Win32API) по сравнению в if/else.
PM   Вверх
SABROG
Дата 28.4.2008, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 4
Всего: 91



А конструкция:

Код

isTrue() ? retTrue() : retFalse();


еще реже...


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
bsa
Дата 28.4.2008, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Цитата(SABROG @ 28.4.2008,  17:11)
А конструкция:

Код

isTrue() ? retTrue() : retFalse();


еще реже...

у меня так чаще, чем switch/case smile
PM   Вверх
Rickert
Дата 29.4.2008, 05:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: 0
Всего: 52



Аналогично


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
chipset
Дата 29.4.2008, 09:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

Репутация: 27
Всего: 165



Паттерн Strategy рулед!

гг шучу


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.2289 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.