Страница 1 из 1

Как зделать проверку кода

Добавлено: Ср сен 21, 2011 19:02:59
Transistor
эсть кодовой замок (ево делаю я). Он зделаний на сдвиговом регистре, код считывается по 2 проводникам. Никак не могу организовать сравнение введенного кода (код накапливается а затем сравнивается с записанным).
Суть в том что чтобы ввести код необходимо его преобразовать в символы а затем используя операции strcpy склеивать символы в кучу. Как сделать проще?

Код: Выделить всё

while (1)
 {
 if (!input(PIN_A3))
 ring (1);// звінок
 else
  {
 if (!input(PIN_A4))
 open ();// кнопка дверей
 else
   {
pass=keybord();//клавіатура
if (pass!=0)
{
itoa (pass,10,key);
for (i=1;i<=5;++i)
{
itoa (keybord(),10,key1);
strcpy(key,key1);
delay_us(5);
}
if (key=="12345")
open ();
}
open ();
   }
  }
 }

Re: Как зделать проверку кода

Добавлено: Ср сен 21, 2011 22:05:46
Dr. Alex
А ты попробуй в процессе набора проверять каждую введённую цифру/букву. А исходный код записать как одномерный массив с колличеством элементов равным длинне кода.

Re: Как зделать проверку кода

Добавлено: Ср сен 21, 2011 22:08:29
rjhaviy
Для опроса клавы можно сделать таймер секунд на 10 и буфер (строку) на 5 байт, а также счетчик длины кода.

Таймер нужен для того, что если ничего не нажимали втечении 10 с, то вводимый код обнуляется
Счетчик длины кода, чтобы проверять код с эталонным, только тогда, когда введены все 5 символов

Если Счетчик длины кода = 5, то
{
проверяем код
}

иначе
{
Если Таймер >0, то
{
уменьшаем Таймер
}
иначе
{
обнуляем буфер и Счетчик длины кода
}
Если нажали на клавишу, то записываем ее код в буфер, счетчик длины кода ++, записываем в Таймер 10сек. Надеюсь ничего не напутал.

Извиняюсь что не в нормальном коде, последний раз программировал лет 10 назад.

Re: Как зделать проверку кода

Добавлено: Ср сен 21, 2011 22:50:01
Transistor
Масив виглядит очен привлекательно по простоте реализации просто создать два масива и проверять их в цикле (ето будеть запасной вариант).
А как бить из буфером? нужно введение символи слепить вместе но как зделать по легче без преобразования в символною строку спомощу етой функции itoa() (внутриная библиотека ССS). Може просто работать без преобразования в строку.
П.С. Прошу кусок кода из буфером.

Re: Как зделать проверку кода

Добавлено: Чт сен 22, 2011 01:07:51
rjhaviy
Это я массив буфером назвал

Код: Выделить всё

const int passSize = 5; //размер пароля 5
int passIndex = 0; //номер символа (байта) в массиве 
char buffer[passSize];
char etalon[passSize]="12345";
Пароль (код) содержит только цифры? Тогда:

ASCII Коды символов 0,1,2,3,4,5: 48, 49, 50, 51, 52, 53 улавливаете?

Надо просто к полученному числу прибавить 48!
Но есть одно но - явного преобразования типа нет! Но его можно преобразовать в процессе.

Код: Выделить всё

if (passIndex<passSize)//если номер символа (байта) в массиве меньше размера пароля
{
//то читаем символ в массив
buffer[passIndex]=(char) (keyboard()+48);// кажется так тип преобразовывается
passIndex++; переходим к следующему байту
}
//иначе 
else
{
passIndex=0; сбрасываем номер символа в массиве
CheckPass(); проверяем пароль с эталоном, ....код не привожу, спать хочу!
}
Вот как-то так.... Надеюсь нигде не напуделял. Я еще тот старый хакер :)
кстати если написать свою функцию проверки, можно пароль хранить не в символьном, а в int формате, тогда преобразовывать не надо.

Код: Выделить всё

int buffer[passSize] = 1,2,3,4,5;// не помню, можно так инициализировать????????

Re: Как зделать проверку кода

Добавлено: Чт сен 22, 2011 01:17:39
rjhaviy
Забыл написать, что в приведенном вами коде не все гладко. В подробности вдаваться некогда, если сможете
нарисуйте алгоритм работы вашего кодового замка, ну или исходник киньте.

Re: Как зделать проверку кода

Добавлено: Чт сен 22, 2011 07:55:33
Аlex
ИМХО, проверку кода нужно делать после каждой нажатой кнопки. Как только нажали неверно - сброс. И для этого вовсе не нужно его укладывать в буфер для сравнения. Тем более в ASCII.

Re: Как зделать проверку кода

Добавлено: Чт сен 22, 2011 18:42:57
Transistor
Проверк после каждова символа делать нехарашо как мне кажетса потаму что можна так подобрать соответствующий сивол так как цифер восем нужно перебрать 7 вариантов. Даже длину пароля можна не учитовать перебором можна сломать. Да с кодом не все гладко но по чуть четь виглажу

Re: Как зделать проверку кода

Добавлено: Чт сен 22, 2011 18:53:06
Аlex
Transistor писал(а):так как чифер восем все во нужно перебрать 7 вариантов.
Вы шутите ? :)
Посмотрел бы я на Вас как Вы подберёте 8-ми значный код за 7 вариантов, учитывая то, что при неправильном нажатии набор будет сбрасываться, и вы об этом знать не будете. Даже если клавиатура будет из 8-ми цифр, Вы будете подбирать вечно....

Re: Как зделать проверку кода

Добавлено: Чт сен 22, 2011 19:32:04
Transistor
Да эсть немношко.

Re: Как зделать проверку кода

Добавлено: Чт сен 22, 2011 19:52:45
rjhaviy
Аlex писал(а):
Transistor писал(а):так как чифер восем все во нужно перебрать 7 вариантов.
Вы шутите ? :)
Посмотрел бы я на Вас как Вы подберёте 8-ми значный код за 7 вариантов, учитывая то, что при неправильном нажатии набор будет сбрасываться, и вы об этом знать не будете. Даже если клавиатура будет из 8-ми цифр, Вы будете подбирать вечно....
Кстати отличный вариант.
Нужен всего один массив, в котором храним запрограммированный пароль, и одна переменная - счетчик правильных нажатий.

Код: Выделить всё

char pass[]="12345"; //пароль
int openflag=0; //флаг открывания;
int index=0; //счетчик правильных нажатий
...
...
...
if (index<sizeof(pass)) // проверяем счетчик, если он меньше размера пароля, то (либо еще не ввели до конца, либо ввели неправильно)
{
   if (pass[index]!= (char) (48+keyboard())// если нажатая клавиша  не совпадает с тем что хранится по текущему индексу (счетчик правильных нажатий),
    index=0; // то сбрасываем счетчик 
   else
    index++; // иначе увеличиваем счетчик правильных нажатий
}
else
openflag=1;
...
...
Код конечноже не идеален... это всего лишь наброски мыслей