Смена пароля в Password.h

forfrends
Offline
Зарегистрирован: 24.02.2015

Всем привет!

Я использую матричную клавиатуру 4х4 и библиотеки Keypad.h и Password.h. Всем известный пример работает без проблем:

#include <Password.h> //http://www.arduino.cc/playground/uploads/Code/Password.zip
#include <Keypad.h> //http://www.arduino.cc/playground/uploads/Code/Keypad.zip

Password password = Password( "1234" );

const byte ROWS = 4; //four rows
const byte COLS = 4; //three columns
char keys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
byte rowPins[ROWS] = {13, 12, A4, A5}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {A3, A2, A1, A0}; //connect to the column pinouts of the keypad


// Create the Keypad
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

void setup(){

  Serial.begin(9600);
  keypad.addEventListener(keypadEvent); //add an event listener for this keypad
}

void loop(){
  keypad.getKey();
}

//take care of some special events
void keypadEvent(KeypadEvent eKey){
  switch (keypad.getState()){
    case PRESSED:
	Serial.print("Pressed: ");
	Serial.println(eKey);
	switch (eKey){
	  case '*':
	    checkPassword();
        password.reset();
	    break;
	  
	  case '#':
	    password.reset();
	    break;
      
	  default:
	    password.append(eKey);
     }
  }
}

void checkPassword(){
  if (password.evaluate()){
    Serial.println("Success");
    //Add code to run if it works
    
  }else{
    Serial.println("Wrong");
    //add code to run if it did not work
    
  }
}

У меня никак не получается програмно менять пароль. То есть мне нужно с клавиатуры набирать новый пароль. Но ничего не выходит. Переменную eKey я сделал глобальной, и теперь ее значение можно получить из любой точки программы. Переменная содержит значение последней нажатой клавиши, это символ типа char в формате '1'.

Порывшись в библиотеке, я узнал что задавать новый пароль можно двумя командами:

Password::Password(char* pass){...}

и

Password::set(char* pass){...}

По сути это одна и таже команда. И вот тут у меня полный ступор. Команды принимают в качестве аргумента переменную типа char*. Но как ее собрать не понятно. Я пробовал собирать переменную так:

char pass;
...
pass += eKey;

потом пробывал устанавливать новый пароль. Пробовал обе команды:

Password password = Password(pass);

и

password.set(pass);

Но результат всегда был один и тот же: Старый пароль (1234) стирался и уже не подходил, а новый (на пример: "123456") тоже не подходил. То есть новый пароль вроде бы и задавался но не правильно. Можете помочь? Как правильно собирать переменную типа char* и задавать новый пароль?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

forfrends пишет:
Я пробовал собирать переменную так:

char pass;
...
pass += eKey;

А поставить Serial.println(pass) после того как собрали, чтобы посмотреть правильно ли собралось что не позволило? Религия или Клапауций запретил? 

Поставьте, посмотрите, правильно ли собирается. И нам расскажете.

А когда убедитесь, что нифига Вы таким способом не собираете, то попробуйте вот это.

forfrends
Offline
Зарегистрирован: 24.02.2015

Только что проверил - собирается не правильно. Вместо собранной переменной получается "квадратик", или что-то другое:

Как правильно собрать?

Если не хотате помогать - просто пройдите мимо. А посылать искать в гугле - это не помощь.

Попробовал так:

strcat( pass, eKey);

Результат тот же, неправильно собирается:

Можете что-то подсказать?

sadman41
Offline
Зарегистрирован: 19.10.2016

Хотел помочь, так как с этим дурацким кейпадом как-то бился тоже, но придется пройти мимо :(

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

ты слышал чонить за массив символов?

sadman41
Offline
Зарегистрирован: 19.10.2016

forfrends пишет:

Попробовал так:

strcat( pass, eKey);

Результат тот же, неправильно собирается:

Так и будет до тех пор, пока вы к значению однобайтового char будете бесконечно добавлять значение другого однобайтового char.  Попробуйте хотя бы к String добавлять для начала.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

forfrends пишет:

Как правильно собрать?

Если не хотате помогать - просто пройдите мимо. А посылать искать в гугле - это не помощь.

Можете что-то подсказать?

Я не знаю, что Вы понимаете под помощью. Я Вам уже подсказал, что Вам нужно изучить работу со строками. Именно изучить, а не тыкаться методом тыка, как Вы это делаете. Но искать Вас посылать нельзя. Чем я могу помочь? Найти за Вас и дать Вам конкретные ссылки? Или чем? Скажите.

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

Тех кого нельзя посылать в гугл, нужно посылать нах, потому что это нежелающий ничему учиться халявщик.

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

Ворота пишет:

Тех кого нельзя посылать в гугл, нужно посылать нах, потому что это нежелающий ничему учиться халявщик.

+5

Efim
Offline
Зарегистрирован: 04.05.2018

Ворота пишет:

Тех кого нельзя посылать в гугл, нужно посылать нах, потому что это нежелающий ничему учиться халявщик.

Обычно люди стесняются своей дикости, а вы это отчаянно демонстрируете. Грубость-признак бессилия. У вас есть одна хорошая черта,она делит вашу задницу пополам.

forfrends
Offline
Зарегистрирован: 24.02.2015

Сказать что кто-то не прав и послать учиться - это все равно что просто послать. Так как помощи - "0". Даже не понятно в чем имено человек ошибся. Я не халявщик. Суда на форум я обращаюсь только в том случае если после многих попыток ничего не вышло. Я не прошу написать ВЕСЬ код за меня. Я сам все сделаю. Прошу лишь помощи в конкретном аспекте. Не хотите помогать? Ну так и проходите мимо и не тратьте ни свое ни мое время.

Если взять и (как сказал sadman41) собирать в строку типа:

String TempPass = "";
TempPass += eKey;

то срока собирается правильно, но как ее потом перевести в правильный формат? :

Password::set(char* TempPass){...}

Просто так, понятное дело, не работает, так как функция принимает char, а TempPass - String. Я пробовал делать преобразование, но ничего не вышло. 

По поводу сборки массива. Пробовал так, но не работает:

char pass[40];
pass += eKey;

пробовал вот так, тоже не работает:

char pass[40];
strcat( pass, eKey);

Если я что-то делаю не так, то покажите как правильно. Исправьте.

Efim
Offline
Зарегистрирован: 04.05.2018

forfrends

Выложите весь код.

forfrends
Offline
Зарегистрирован: 24.02.2015

А смысл выкладывать весь код? В данном случае проблема определилась, и суть вопроса сводится к одному: как собрать переменную формата char из других char?

Есть переменная char eKey которая содержит в себе символ нажатой кнопки в формате '1'.

Функция задания пароля выглядит вот так:

Password::Password(char* pass){...}

или

Password::set(char* pass){...}

вопрос: как правильно собрать переменную char* pass из char eKey? Длинна pass может быть до 8-ми символов.

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

forfrends пишет:

Если взять и (как сказал sadman41) собирать в строку типа:

String TempPass = "";
TempPass += eKey;

то срока собирается правильно, но как ее потом перевести в правильный формат? :

Password::set(char* TempPass){...}

Password::set(TempPass.c_str());

 

forfrends
Offline
Зарегистрирован: 24.02.2015

xDriver, спасибо так заработало!

b707
Offline
Зарегистрирован: 26.05.2017

forfrends пишет:

суть вопроса сводится к одному: как собрать переменную формата char из других char?

НИКАК.

В данном случае Пассворд имеет тип char*, а не char. Вы смысл оператора звездочка (*) понимаете? - он тут меняет все.

 

b707
Offline
Зарегистрирован: 26.05.2017

xDriver пишет:

Password::set(TempPass.c_str());

 

ну и зря. Это не помощь, это подаяние

forfrends
Offline
Зарегистрирован: 24.02.2015

Из всех кто ответил, только оди человек привел пример, которы хоть и "боком" помог решить проблему.

b707
Offline
Зарегистрирован: 26.05.2017

forfrends пишет:

Из всех кто ответил, только оди человек привел пример, которы хоть и "боком" помог решить проблему.

потому что примеры - бесполезны для новичков. Они на них не учатся.

Наиболее правильный совет был - пойти в гугль и изучить работу с символьными массивами - теми самыми char*., которые вы путаете с char

 

sadman41
Offline
Зарегистрирован: 19.10.2016

forfrends пишет:

А смысл выкладывать весь код? В данном случае проблема определилась, и суть вопроса сводится к одному: как собрать переменную формата char из других char?

Есть переменная char eKey которая содержит в себе символ нажатой кнопки в формате '1'.

 Ну, раз в целом все работает со String и вы уже догадались сделать массив char, то открою вам секрет:  строка есть символьный массив, в каждом элементе которого лежит один char. При получении нового символа просто кладите его в следующий элемент. Завершать строку нужно знаком '\0', иначе системные функции не поймут, что это строка.

Efim
Offline
Зарегистрирован: 04.05.2018

forfrends

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

forfrends
Offline
Зарегистрирован: 24.02.2015

вот некоторые ссылки на примеры, которые я пересмотрел и перепробовал:

http://cppstudio.com/post/695/

http://cppstudio.com/post/698/

http://www.mir-koda.ru/full_leson_cpp.php?id=15

http://www.mir-koda.ru/full_leson_cpp.php?id=16

http://scrutator.me/post/2014/09/02/cpp_strings_basics.aspx

https://prog-cpp.ru/c-string/

Нормальных примеров работы с *char, я так и не нашел...

Efim
Offline
Зарегистрирован: 04.05.2018

forfrends

Вам нужно это Тык

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

forfrends пишет:

Нормальных примеров работы с *char, я так и не нашел...

А я ведь Вас спрашивал: "Вам найти и дать ссылку?". Вы не ответили - сами себе злобный буратино.

forfrends
Offline
Зарегистрирован: 24.02.2015

ЕвгенийП, дайте ссылку

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Вот здесь про строки как таковые - объясняется, что просто массив, объясняется смысл нулевого символа (часто скрытого) и т.п.

А вот здесь продолжение - подробно с примерами разобраны самые часто используемые функции работы со строками.

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Ну тогда еще по указателям Тык

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

forfrends пишет:

ЕвгенийП, дайте ссылку

Имя, сестра! Имя! (с)