Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.02.2012, 19:44   #11
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

1. Сразу приучайся не использовать магические числа.
2. Сразу возьми себе за правило - если можно не использовать вложенные ветвления - никогда их не используй.

Пример 1:
Код:
        // где то в объявлениях:
        enum eMove { eUp = 72, eDown = 80, eRight = 77, eLeft = 75 };

        int move= _getch(); //привязка "move" к нажатию определенной далее кнопки
	if (move==eUp) // <- индекс обозначающий стрелочку "вверх"
		move_up(); //функция движения вверх
	else if (move==eRight)
		move_right(); //функция движения вправо
	else if (move==eDown)
		move_down(); //функция движения вниз
	else if (move==eLeft)
		move_left(); //функция движения влево
Если вдруг изменятся условия, и нужно будет заменить коды клавиш, то любые переделки коснутся только eMove в одном месте программы. А не во всех 100500 местах, где ты имел неосторожность хардкорно закодить магические числа.

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

Пример 2:
Предположим, тебе нужно обрабатывать много разных клавиш. И если эта клавиша eLeft (как из твоего примера), то прежде чем будет запущена функция её обработки, будет последовательно проверены все предыдущие условия.

Это нерациональное падение производительности. Можно сократить время поиска функции обработчика, до некоторого минимального и фиксированного значения. Если использовать switch
Код:
// где то в объявлениях:
	enum eMove { eUp = 72, eDown = 80, eRight = 77, eLeft = 75 };

	int move= _getch(); //привязка "move" к нажатию определенной далее кнопки

	switch(move)
	{
		case eUp:    { move_up();     break; }
		case eRight: { move_right();  break; }
		case eDown:  { move_down();   break; }
		case eLeft:  { move_left();   break; }
		default:     { move_unkown(); break; }
	}
Компилятор умеет преобразовывать свитчи в хитрые структуры, и очень хорошо их оптимизировать. Поэтому, если есть возможность предпочесть свитч вложенным ифам, то лучше так и сделать.
_Bers вне форума Ответить с цитированием
Старый 29.02.2012, 20:00   #12
Kamilius
Пользователь
 
Регистрация: 28.02.2012
Сообщений: 23
По умолчанию

Спасибо, но впервые стыкаюсь с enum.
Kamilius вне форума Ответить с цитированием
Старый 29.02.2012, 21:21   #13
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Kamilius Посмотреть сообщение
Спасибо, но впервые стыкаюсь с enum.
Грубо говоря, это просто целочисленные константы.

Код:
enum eMove { eUp = 72, eDown = 80, eRight = 77, eLeft = 75 };
Теперь, вместо циферки 72 в своём коде ты можешь писать eUp

Причем, eUp - это константа, имеющая заданный программистом тип: eMove

Например:

Код:
//функция может принять только значения типа eMove
void Foo(eMove arg)  
{
   //здесь делаем что хотим
}
А использовать вот так:

Код:
Foo(eUp);     //можно. eUp является eMove
Foo(eDown); //можно. eDown является eMove
Foo(eRight); //можно. eRight является eMove
Foo(eLeft);  //можно. eLeft является eMove
Foo(0);       //нельзя! Ошибка компиляции. Ноль не является eMove
Таким образом, внутри функций не обязательно выполнять проверку допустимых значений. Они будут работать только с членами заданного перечисления. И все проверки валидности аргументов будут вычисляться компилятором.

Ещё один пример:

Код:
namespace type1 { enum eType { eArg1, eArg2 }; };
namespace type2 { enum eType { eArg1, eArg2 }; };

void foo(type1::eType val){	std::cout<< "type1::eType\n"; }
void foo(type2::eType val){	std::cout<< "type2::eType\n"; }

int main()
{
	foo(type1::eArg1); //вывод: type1::eType
	foo(type2::eArg1); //вывод: type2::eType
}
Перечисление - это целочисленные константы, имеющие собственный тип данных, который указывает программист.

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

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

Что гарантирует тебе безопасную работу. Нельзя будет ничайно скормить обработчику клавиши какой то левый непонятный код.
_Bers вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Delphi: аппроксимация функций методом базиса из финитных функций Denna Помощь студентам 1 12.03.2012 19:23
Delphi. Посимвольное раскидывание string'а по кнопкам. Риндера Помощь студентам 13 08.11.2010 17:30
Вопрос по кнопкам... Han_Nik Помощь студентам 4 19.05.2010 20:41
переключение раскладки клавиатуры по кнопкам Alt и Shift Slash3 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 4 10.03.2009 13:08
пара вопросов по кнопкам grey Помощь студентам 4 11.11.2007 19:09