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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> "switch" vs "if/else", выбор? 
V
    Опции темы
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   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

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

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

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

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


 




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


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

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