Консультация № 170341
10.07.2009, 18:53
0.00 руб.
0 4 2
Уважаемые эксперты , помогите , пожалуйста, разобратся-есть код (http://pmg.org.ru/nehe/nehe07.htm) , обьявляется массив и потом он используется в логической операции
Вопрос, массив не инициализируется , значит автор просто пропустил эту процедуру или действительно можно так объявить массив , а потом подставлять в него значение VK_UP ?

Приложение:
bool keys[256]; // Массив, использующийся для сохранения состояния клавиатуры
..............

if (keys[VK_UP]) // Клавиша стрелка вверх нажата?

{

xspeed-=0.01f; // Если так, то уменьшим xspeed

}


Обсуждение

давно
Академик
20764
1861
10.07.2009, 19:12
общий
это ответ
Здравствуйте, sergion-aa.

Из приведённого вами фрагмента не ясно, в каком контексте объявлен массив, но если он глобальный (объявлен вне какой-либо функции), то во-первых, он инициализируется false-ами (в общем случае - нолями), а во-вторых, доступен из любых мест программы, которые его могут и заполнить

Посмотрел по ссылке - действительно глобальный. Значит, инициализирован нолями.
4
Хмм.. Я специально помотрел у Дейтела, массив автоматически не инициализируется, нужно указать , хотя бы одно значение
Неизвестный
10.07.2009, 19:35
общий
это ответ
Здравствуйте, sergion-aa.
Уроки идут по порядку, и автор объясняет только новые строки кода. Объяснение приводится в первом уроке (http://pmg.org.ru/nehe/nehe01.htm):

Если произошло нажатие кнопки (на клавиатуре) мы можем узнать какая клавиша это была считав wParam. Тогда я делаю, чтобы эта ячейка в массиве keys[ ] содержала true. Таким образом, я могу считать этот массив позже и найти какая клавиша была нажата. Это позволяет отследить нажатия сразу несколько клавиш одновременно.

case WM_KEYDOWN: // Была ли нажата кнопка?
{
keys[wParam] = true; // Если так, мы присваиваем этой ячейке true
return 0; // Возвращаемся
}

Если кнопка была отпущена мы можем узнать какая клавиша это была считав wParam. Тогда мы делаем, чтобы эта ячейка в массиве keys[ ] была равна false. Таким образом, когда Вы считываете эту ячейку, Вы будете знать нажата ли она до сих пор или была отпущена. Другие кнопки на клавиатуре могут быть представлены в диапазоне 0-255. Когда мы нажимаем кнопку со скан-кодом 40, например, keys[40] вернёт true. Когда я её отпущу, она вернёт false. Вот так мы используем ячейки для хранения нажатых клавиш.

case WM_KEYUP: // Была ли отпущена клавиша?
{
keys[wParam] = false; // Если так, мы присваиваем этой ячейке false
return 0; // Возвращаемся

Также следует смотреть оригинал, поскольку переводы некоторых уроков от него несколько отличаются, кроме того, там можно скачать полный исходник каждого урока в конце страницы (http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=01).
Или можете реализовать по-своему (http://vsokovikov.narod.ru/New_MSDN_API/Keyb_input/notify_wm_keydown.htm), например, как-то так:

...
case WM_KEYDOWN:
{
KeyPress(wParam, lParam);
return 0;
}
...
void KeyPress(WPARAM wParam, LPARAM lParam)
{
if(wParam == VK_LEFT)
{
// ...
}
}
5
давно
Академик
20764
1861
13.07.2009, 22:28
общий
sergion-aa:
Кто такой Дейтел? В любом случае - ещё Керниган и Ричи 30 лет назад в явном виде декларировали обратное.
Цитирую ISO/IEC 9899:TC2 пункт 6.7.8:

10 If an object that has automatic storage duration is not initialized explicitly, its value is
indeterminate. If an object that has static storage duration is not initialized explicitly,
then:
— if it has pointer type, it is initialized to a null pointer;
— if it has arithmetic type, it is initialized to (positive or unsigned) zero;
— if it is an aggregate, every member is initialized (recursively) according to these rules;
— if it is a union, the first named member is initialized (recursively) according to these
rules.
Неизвестный
15.07.2009, 11:56
общий
Хватов Сергей:
Гейтс и его компилятор на вашей стороне-)
Еще раз спасибо за ответ.
GL
Форма ответа