реклама на сайте
подробности

 
 
3 страниц V  < 1 2 3 >  
Reply to this topicStart new topic
> Проблема с преобразованиями
haker_fox
сообщение Nov 22 2011, 09:57
Сообщение #16


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



QUOTE (hd44780 @ Nov 22 2011, 17:48) *
Буфер надо, если необходима возможность полного редактирования числа. Да и то - проще не сканкоды в буфер класть, а готовые цифры. Проще и понятнее. У вас же не матрица 105 клавиш от компа?

Я и не предлагал скан-коды в буфер класть) Возможно не ясно выразился.


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
max_mart
сообщение Nov 22 2011, 10:10
Сообщение #17


Местный
***

Группа: Участник
Сообщений: 248
Регистрация: 30-09-11
Пользователь №: 67 474



нет не матрица. Всего 9 клавиш.
Я не могу сообразить по коду, как все это реализовать. Поэтому и выложил его. Чтобы объеденитьь его вместе с тем, что я просил.
Помогите, плиз.
Go to the top of the page
 
+Quote Post
ut1wpr
сообщение Nov 22 2011, 10:49
Сообщение #18


Частый гость
**

Группа: Участник
Сообщений: 98
Регистрация: 20-06-05
Пользователь №: 6 150



Цитата(max_mart @ Nov 22 2011, 14:10) *
нет не матрица. Всего 9 клавиш.
Я не могу сообразить по коду, как все это реализовать. Поэтому и выложил его. Чтобы объеденитьь его вместе с тем, что я просил.
Помогите, плиз.
Вам ведь уже четко показали. Осталось на код положить.
Код
Result = 0;
while( GetCodeValue = GetCodeButton() != ENTER ){
Result *= 10;
Result += GetCodeValue;
}

Где-то так...
Но вопрос контроля за переполнением типа лежит на программисте.
Об этом надо помнить, или вводить программный контроль.


Сообщение отредактировал ut1wpr - Nov 22 2011, 10:50
Go to the top of the page
 
+Quote Post
max_mart
сообщение Nov 22 2011, 11:08
Сообщение #19


Местный
***

Группа: Участник
Сообщений: 248
Регистрация: 30-09-11
Пользователь №: 67 474



Не понял:
зачем умножать на 10 и для чего прибавлять код кнопки?
И потом у меня вверху указан код, который я реализую! Мне надо под него синхронизировать выше указанную проблему!!!
Go to the top of the page
 
+Quote Post
hd44780
сообщение Nov 22 2011, 11:39
Сообщение #20


Профессионал
*****

Группа: Свой
Сообщений: 1 202
Регистрация: 26-08-05
Из: Донецк, ДНР
Пользователь №: 7 980



Цитата(max_mart @ Nov 22 2011, 14:08) *
зачем умножать на 10 и для чего прибавлять код кнопки?

Чтобы преобразовать последовательность Ваших кнопок в число, которое Вы хотите поиметь на выходе сего алгоритма.
Оно же для запоминания последовательности нажатий кнопок, о чём Вы спрашивали выше.

Вы же сами написали где-то выше по теме:

Я знаю что, чтобы получить например число 453 из введенных цифр надо просто: 4*100+5*10+3=453 в 16 битной переменной.

Совершенно верно написали. Я этим умножением и сложением это и делаю.

Цитата(max_mart @ Nov 22 2011, 14:08) *
И потом у меня вверху указан код, который я реализую! Мне надо под него синхронизировать выше указанную проблему!!!


А мне стало страшно, когда я увидел Ваш код w00t.gif Им только детей маленьких пужать - какое страшное это программирование ....

Отделите опрос клавиатуры от получения числа. А если Вы завтра захотите эту клавиатуру ещё в 10 местах опрашивать? Или поменять тип клавиатуры? Или ещё что-то? И что, будете 10 раз писать один и тот же алгоритм опроса?

Я бы это делал как-то так:

Код
int GetCodeButton()
{
if (!ZERO)
  return 0;

if (!ONE)
  return 1;

.............

if (!ACCEPT)
  return 20;
} // GetCodeButton

// Цикл получения числа
// Накопитель
word Result = 0;
// счётчик введённых знаков
int count=0;
......

while( 1 )
{
int GetCodeValue = GetCodeButton();

// проверка Enter
if (GetCodeValue==20)
  break;
Result *= 10;
Result += GetCodeValue;

count ++;
// Проверка, что ввели 5 знаков
if (count>5)
  break;
} // while


Проверку переполнения накопителя сами добавьте. Это Вам домашнее задание лично от меня biggrin.gif .
Потому что контроля на 5 цифр недостаточно - число 99999 - 5 цифр, но в 16 бит оно не влезает.

Сообщение отредактировал hd44780 - Nov 22 2011, 11:54


--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса.
(с) Мария Эдуарда
Go to the top of the page
 
+Quote Post
max_mart
сообщение Nov 22 2011, 11:54
Сообщение #21


Местный
***

Группа: Участник
Сообщений: 248
Регистрация: 30-09-11
Пользователь №: 67 474



ладно подумаю на накопителем. цифр всего 5, а максимальное число то у меня будит 65535
Go to the top of the page
 
+Quote Post
ut1wpr
сообщение Nov 22 2011, 12:45
Сообщение #22


Частый гость
**

Группа: Участник
Сообщений: 98
Регистрация: 20-06-05
Пользователь №: 6 150



Цитата(max_mart @ Nov 22 2011, 15:54) *
ладно подумаю на накопителем. цифр всего 5, а максимальное число то у меня будит 65535

Не знаю, кто и кого там у вас по утрам будит, а код с проверкой будЕт такой:
Код
Result = 0;
while( (GetCodeValue = GetCodeButton() != ENTER) && (Result <= 65535) ){
  Result *= 10;
  Result += GetCodeValue;
}
Go to the top of the page
 
+Quote Post
max_mart
сообщение Nov 22 2011, 14:05
Сообщение #23


Местный
***

Группа: Участник
Сообщений: 248
Регистрация: 30-09-11
Пользователь №: 67 474



[удалено]

Сообщение отредактировал IgorKossak - Nov 22 2011, 14:20
Причина редактирования: Сплошные эмоции
Go to the top of the page
 
+Quote Post
neiver
сообщение Nov 22 2011, 14:20
Сообщение #24


Местный
***

Группа: Участник
Сообщений: 214
Регистрация: 22-03-10
Из: Саратов
Пользователь №: 56 123



Цитата(ut1wpr @ Nov 22 2011, 16:45) *
Не знаю, кто и кого там у вас по утрам будит, а код с проверкой будЕт такой:
Код
Result = 0;
while( (GetCodeValue = GetCodeButton() != ENTER) && (Result <= 65535) ){
  Result *= 10;
  Result += GetCodeValue;
}

Здесь проверка переполнения будет работать только, если Result - 32-х разрядная переменная. Беззнаковая 16-ти разрядная переменная всегда меньше или равна 65535.
Считать введенные цифры тоже не корректно, можно ввести 99999 и будет переполнение. На переполнение можно проверить так:
Код
if(Result > Result*10)

Если это условие выполняется, то следующая цифра в переменную уже не поместится.
Go to the top of the page
 
+Quote Post
ut1wpr
сообщение Nov 22 2011, 15:11
Сообщение #25


Частый гость
**

Группа: Участник
Сообщений: 98
Регистрация: 20-06-05
Пользователь №: 6 150



Цитата(neiver @ Nov 22 2011, 18:20) *
Здесь проверка переполнения будет работать только, если Result - 32-х разрядная переменная. Беззнаковая 16-ти разрядная переменная всегда меньше или равна 65535.
Считать введенные цифры тоже не корректно, можно ввести 99999 и будет переполнение. На переполнение можно проверить так:
Код
if(Result > Result*10)

Если это условие выполняется, то следующая цифра в переменную уже не поместится.
Верно. Поправка принята. Либо long Result, либо приведенный пример проверки.
Go to the top of the page
 
+Quote Post
max_mart
сообщение Nov 22 2011, 15:36
Сообщение #26


Местный
***

Группа: Участник
Сообщений: 248
Регистрация: 30-09-11
Пользователь №: 67 474



int GetCodeButton()
{
if (!ZERO)
return 0;

if (!ONE)
return 1;

.............

if (!ACCEPT)
return 20;
} // GetCodeButton
Хотелось бы узнать какое значение получает функция GetCodeButton(), если ниче не нажато?
Result = 0;
while( (GetCodeValue = GetCodeButton() != ENTER) && (Result <= 65535) ){
Result *= 10;
Result += GetCodeValue;
}
И если я буду использовать loong int result. Смогу ли яего потом сдвинуть вправо на 16 бит ю?
Например:
unsigned int addr
addr = (unsigned int)(result>>16);
Go to the top of the page
 
+Quote Post
hd44780
сообщение Nov 22 2011, 17:51
Сообщение #27


Профессионал
*****

Группа: Свой
Сообщений: 1 202
Регистрация: 26-08-05
Из: Донецк, ДНР
Пользователь №: 7 980



Цитата(max_mart @ Nov 22 2011, 18:36) *
Хотелось бы узнать какое значение получает функция GetCodeButton(), если ниче не нажато?


Интернет глюнул, моя правка потерялась ...
Напиши в конце return 100;
Если ничего не нажали, вернёт 100.

Цитата(max_mart @ Nov 22 2011, 18:36) *
И если я буду использовать loong int result. Смогу ли яего потом сдвинуть вправо на 16 бит ю?
Например:
unsigned int addr
addr = (unsigned int)(result>>16);


Сможешь. А почему нет?


--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса.
(с) Мария Эдуарда
Go to the top of the page
 
+Quote Post
max_mart
сообщение Nov 22 2011, 18:31
Сообщение #28


Местный
***

Группа: Участник
Сообщений: 248
Регистрация: 30-09-11
Пользователь №: 67 474



Хотелось бы узнать какое значение получает функция GetCodeButton(), если ниче не нажато?

реализовываю немного по-другому(по-своему):
unsigned char k[5], index=0;

if ("not AACEPT")
{
k[index]= GetCodeButton()
}
if ("ACCEPT")
{
например если 456: addr = k[2]*100+k[1]+k[0];
Если (addr > 65535) ошибка;
Если (введено больше 5 цифр) ошибка;
}

а 100!!! Извиняюсь!!! Не прочитал сразу до конца!!! ПЕРЕГРЕВ!!!!))) rolleyes.gif

А вот теперь сразу и другой вопрос. Как мне обработать все это, чтобы он не сохранял знач 100(игнорировал его) в массив k[index] или в переменную типа long int???
Go to the top of the page
 
+Quote Post
hd44780
сообщение Nov 22 2011, 18:34
Сообщение #29


Профессионал
*****

Группа: Свой
Сообщений: 1 202
Регистрация: 26-08-05
Из: Донецк, ДНР
Пользователь №: 7 980



Цитата(max_mart @ Nov 22 2011, 21:31) *
Как мне обработать все это, чтобы он не сохранял знач 100(игнорировал его) в массив k[index] или в переменную типа long int???


int key = GetCodeButton();

if (key == 100)
{ // Ничего не нажали
} // if
else
{ // что-то нажали
} // else


--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса.
(с) Мария Эдуарда
Go to the top of the page
 
+Quote Post
max_mart
сообщение Nov 22 2011, 19:08
Сообщение #30


Местный
***

Группа: Участник
Сообщений: 248
Регистрация: 30-09-11
Пользователь №: 67 474



[quote name='max_mart' date='Nov 22 2011, 21:31' post='997204']
Хотелось бы узнать какое значение получает функция GetCodeButton(), если ниче не нажато?

реализовываю немного по-другому(по-своему):
unsigned char k[5], index=0;

if ("not AACEPT")
{
k[index]= GetCodeButton()
}
if ("ACCEPT")
{
например если 456: addr = k[2]*100+k[1]+k[0];
Если (addr > 65535) ошибка;
Если (введено больше 5 цифр) ошибка;
}

а 100!!! Извиняюсь!!! Не прочитал сразу до конца!!! ПЕРЕГРЕВ!!!!))) rolleyes.gif

А вот теперь сразу и другой вопрос. Как мне обработать все это, чтобы он не сохранял знач 100(игнорировал его) в массив k[index] или в переменную типа long int???

Наверное так да???
if (GetCodeButton()!= 100) k[index] = KEYBOARD();


[quote name='max_mart' date='Nov 22 2011, 21:35' post='997217']
[quote name='max_mart' date='Nov 22 2011, 21:31' post='997204']
Хотелось бы узнать какое значение получает функция GetCodeButton(), если ниче не нажато?

реализовываю немного по-другому(по-своему):
unsigned char k[5], index=0;

if ("not AACEPT")
{
k[index]= GetCodeButton()
}
if ("ACCEPT")
{
например если 456: addr = k[2]*100+k[1]+k[0];
Если (addr > 65535) ошибка;
Если (введено больше 5 цифр) ошибка;
}

а 100!!! Извиняюсь!!! Не прочитал сразу до конца!!! ПЕРЕГРЕВ!!!!))) rolleyes.gif

А вот теперь сразу и другой вопрос. Как мне обработать все это, чтобы он не сохранял знач 100(игнорировал его) в массив k[index] или в переменную типа long int???

Наверное так да???
if (GetCodeButton()!= 100) k[index] = KEYBOARD();
Пардон вместо KEYBOARD(), надо GetCodeButton(). Перегрев!!!))) rolleyes.gif


И k[index++] = GetCodeButton(); - так надо, а не k[index]= GetCodeButton() rolleyes.gif
Go to the top of the page
 
+Quote Post

3 страниц V  < 1 2 3 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 17th June 2025 - 20:41
Рейтинг@Mail.ru


Страница сгенерированна за 0.01463 секунд с 7
ELECTRONIX ©2004-2016