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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.08.2011, 02:10   #1
MooNDeaR
В стагнации
Участник клуба
 
Аватар для MooNDeaR
 
Регистрация: 29.07.2011
Сообщений: 1,303
По умолчанию Ошибка в работе с функцией getch()

В общем забыл я коды стрелочек. Решил всё это дело найти через getch(). Сделал это вот так.

Код:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>

int main()
{
	while(1)
{      
        system("CLS");
        char c = getch();
	if(!c){ c = getch(); printf("EXTENDED CODE: %d\n",c); }
	else
		printf("USUAL CODE: %d\n",c);
	system("PAUSE");
}
}
По большому счёту я даже размахнулся делая обработку клавиш с расширенной кодировкой, ибо мне нужны стрелочки. (коды: 72,77,80,75 обычной кодировки). Дык она мне каждый раз при нажатии выдает сначала -32, а затем уже код стрелки. Причем при любой стрелке это -32 вылазит. Что за шутки такие?

если написать так:

Код:
c = getch();
c = getch();
чтобы выгрузить из буфера лишний символ, тогда буквы приходится по 2 раза нажимать, ибо они тоже в обычной кодировке, но никаких "МиНуСтРиДцАтЬдВа" не выдают.

P.S.
Расширенные символы обрабатываются корректно.

P.P.S
Компилю на Visual Studio 2010
E-mail: pashaworking@gmail.com | ICQ: 479914426 | Skype: moondearr
Понять, чего от тебя требует заказчик – это уже половина всей работы, а иногда и полностью выполненное задание.
MooNDeaR вне форума Ответить с цитированием
Старый 07.08.2011, 19:29   #2
MooNDeaR
В стагнации
Участник клуба
 
Аватар для MooNDeaR
 
Регистрация: 29.07.2011
Сообщений: 1,303
По умолчанию

Я попробовал fflush() для stdout и stdin. Но не помогло
E-mail: pashaworking@gmail.com | ICQ: 479914426 | Skype: moondearr
Понять, чего от тебя требует заказчик – это уже половина всей работы, а иногда и полностью выполненное задание.
MooNDeaR вне форума Ответить с цитированием
Старый 07.08.2011, 19:37   #3
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Коды стрелочек
#72 - Вверх
#75 - Влево
#77 - Вправо
#80 - Вниз
#27 - Escape
#13 - Enter
_-Re@l-_ вне форума Ответить с цитированием
Старый 07.08.2011, 19:41   #4
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Согласно документации, getch может вернуть либо 0, либо 0xE0 (-32 в десятичной). Так что это нужно учитывать в коде
Код:
if (c == 0 || c == -32)
netrino вне форума Ответить с цитированием
Старый 08.08.2011, 08:03   #5
MooNDeaR
В стагнации
Участник клуба
 
Аватар для MooNDeaR
 
Регистрация: 29.07.2011
Сообщений: 1,303
По умолчанию

Цитата:
Согласно документации, getch может вернуть либо 0, либо 0xE0 (-32 в десятичной). Так что это нужно учитывать в коде
А если я буду печатать символ с кодом -32 (он же 224, он же "р" в DOS кодировке, он же "а" в ANSI кодировке?) Тогда как быть? Или по два раза тыкать?
E-mail: pashaworking@gmail.com | ICQ: 479914426 | Skype: moondearr
Понять, чего от тебя требует заказчик – это уже половина всей работы, а иногда и полностью выполненное задание.
MooNDeaR вне форума Ответить с цитированием
Старый 08.08.2011, 10:25   #6
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,711
По умолчанию

Цитата:
с кодом -32 (он же 224
Абсолютно не он же! Гетч не байт возвращает.
p51x вне форума Ответить с цитированием
Старый 08.08.2011, 11:17   #7
MooNDeaR
В стагнации
Участник клуба
 
Аватар для MooNDeaR
 
Регистрация: 29.07.2011
Сообщений: 1,303
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Абсолютно не он же! Гетч не байт возвращает.
Да ну? Написал вот такой код

Код:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>

int main()
{
	char c = getch();
	if( !c || c== -32 ) printf("EXTENDED CODE: %d\n",getch());
	else
		printf("USUAL CODE: %d\n",c);
	system("PAUSE");
}
Жму "р" (код -32) и что я вижу? Что надо нажимать "р" еще раз и только тогда он мне пишет "EXTENDED CODE: 224" Гадом буду "р" - не в расширенной раскладке

P.S.
0хЕ0 = 224 в десятичной и -32 в char
E-mail: pashaworking@gmail.com | ICQ: 479914426 | Skype: moondearr
Понять, чего от тебя требует заказчик – это уже половина всей работы, а иногда и полностью выполненное задание.

Последний раз редактировалось MooNDeaR; 08.08.2011 в 11:21.
MooNDeaR вне форума Ответить с цитированием
Старый 08.08.2011, 12:08   #8
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,711
По умолчанию

Код:
char c = getch();
Учите язык и преобразование типов!


P.S. Если вы не видете разницы между 0xFFFFFFE0 и 0x000000E0, то это не проблемы функции.

Последний раз редактировалось p51x; 08.08.2011 в 12:20.
p51x вне форума Ответить с цитированием
Старый 08.08.2011, 12:40   #9
MooNDeaR
В стагнации
Участник клуба
 
Аватар для MooNDeaR
 
Регистрация: 29.07.2011
Сообщений: 1,303
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Код:
char c = getch();
Учите язык и преобразование типов!


P.S. Если вы не видете разницы между 0xFFFFFFE0 и 0x000000E0, то это не проблемы функции.
Хорошо, разницу-то я увидел. Конктретного совета я дождусь?

Заменил:
Код:
char c = getch();
на

Код:
int c = getch();
Не помогло. Только теперь у меня нажатие стрелочки равно 224, а "р" всё также не считывается
Блин ругать дык всё хотят, а помочь никто Мне кто-нибудь код исправит?*
E-mail: pashaworking@gmail.com | ICQ: 479914426 | Skype: moondearr
Понять, чего от тебя требует заказчик – это уже половина всей работы, а иногда и полностью выполненное задание.

Последний раз редактировалось MooNDeaR; 08.08.2011 в 13:22.
MooNDeaR вне форума Ответить с цитированием
Старый 08.08.2011, 13:25   #10
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,711
По умолчанию

Цитата:
Не помогло.
Да ну! А у меня работает... ЧЯДНТ?
p51x вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Аналог getch или русские буквы в getch YourLastSong Общие вопросы C/C++ 1 08.05.2011 19:25
ошибка в коде с функцией else beygul Помощь студентам 1 26.11.2010 16:34
Ошибка getch dogma007 Помощь студентам 2 22.12.2009 18:49
Ошибка с функцией fopen motorway PHP 0 29.07.2009 17:30
Вопрос по работе с функцией ВПР igoreka Microsoft Office Excel 2 07.12.2007 12:50