Делаем библиотеку для ардуино
Я изучаю создание библиотек на arduino, я хочу сделать библиотеку, которая работает с массивами, заданными пользователем, например:
Пользователь задает массив значений int, когда определенная функция вызывается, библиотека проверяет, является ли какой-либо экземпляр истинным или нет, и устанавливает возвращаемую функцию в соответствии с массивом.
Пример кода:
//in project example
#include <Keyss.h>
int rows=4;
int cols=2;
int a=0;
int b=1;
int c=2;
int inp=3;
int keyss[4][2]={
{0,1},,
{2,3},
{4,5},
{6,7}
};
Key key((keyss),rows,cols,inp,a,b,c);
void setup(){
Serial.begin(9600);
int keyprint=key.getkey();
Serial.println(key print);
}
void loop(){
}
And this will be the library files Keys.h
#ifndef KEYSS_H
#define KEYSS_H
#include <Arduino.h>
class Key {
public:
Key(int (*keys)[4],int rows,int cols,int inp,int t1,int t2,int t3);
int getkey();
int waitforkey();
private:
int *_keys;
int _rows;
int _cols;
int _inp;
int _t1;
int _t2;
int _t3;
};
#endif
And Keys.CPP
#include <Keyss.h>
//initialization
Key::Key(int (*keys)[4],int rows,int cols,int inp,int t1,int t2,int t3){
_keys=keys[4];
_rows=rows;
_cols=cols;
_inp=inp;
_t1=t1;
_t2=t2;
_t3=t3;
pinMode(_inp,INPUT);
pinMode(_t1,OUTPUT);
pinMode(_t2,OUTPUT);
pinMode(_t3,OUTPUT);
}
//getkey()
int Key::getkey(){
int _a;
int _b;
int _i=0;
int _keymap=false;
int _val;
int _dt=500;
int _s1;
int _input;
for(_a=0;_a<_rows;_a++){
for(_b=0;_b<_cols;_b++){
_s1=_i;
digitalWrite(_t1,(_s1>>0)&1);
digitalWrite(_t2,(_s1>>1)&1);
digitalWrite(_t3,(_s1>>2)&1);
delayMicroseconds(_dt);
_input=digitalRead(_inp);
if(_input==true && _keymap==false){
_val=_keys[_a*_cols+_b];
_keymap=true;
}
_i++;
}
}
if(_keymap==false){
_val=-1;
}
return _val;
}
//waitforkey()
int Key::waitforkey(){
int _waitfor=getkey();
while(_waitfor<0){
_waitfor=getkey();
}
return _waitfor;
}
Теперь у меня есть проблема: я не знаю, как использовать или назначать массив в библиотеке Я не знаю, как использовать функции для обращения к массиву, который вводит пользователь, как здесь
//in project example
#include <Keyss.h>
int rows=4;
int cols=2;
int a=0;
int b=1;
int c=2;
int inp=3;
int keyss[4][2]={
{0,1},,
{2,3},
{4,5},
{6,7}
};
Key key((keyss),rows,cols,inp,a,b,c);
void setup(){
Serial.begin(9600);
int keyprint=key.getkey();
Serial.println(key print);
}
void loop(){
}
Как мне использовать функцию или библиотеку для обращения к массиву, заданному пользователем?
Пожалуйста, как мне это сделать?
Выдает эту ошибку
@Joseph Afodu, 👍0
1 ответ
Лучший ответ:
Ваша переменная keys
представляет собой двумерный массив int
, т. е. массив
массивы. В C++, когда массив присваивается переменной или передается как
аргумент, он неявно распадается на указатель на свой первый элемент.
Обратите внимание, однако, что поведение распада на указатель не является рекурсивным.
В этом случае вы получите указатель на массив из трех int
.
Ваш код должен работать, если вы укажете правильный тип для класса _keys
элемент и параметр конструктора keys
:
class Key {
public:
Key(int (*keys)[3], int trig1, int trig2, int trig3, int inpin);
int getkey();
private:
int (*_keys)[3]; // указатель на массив из 3 int.
int _trig1;
int _trig2;
int _trig3;
int _inpin;
int _keye;
};
Обновлено: вы полностью изменили вопрос до такой степени, что мой ответ может быть уже не актуален. В предыдущей версии программы вопрос, похоже, вы хотели использовать двумерный массив чисел 3×3 в класс. В текущей версии вы используете массив произвольных размеры представлены в виде сглаженного одномерного массива. Это совсем другие подходы.
Если вы хотите использовать двумерный массив, количество столбцов должно быть константа времени компиляции. Вы должны объявить переменную-член как указатель на массив следующим образом:
int (*_keys)[2]; // здесь два столбца, а не четыре!
назначьте это так:
_keys = keys; // НЕ подписывать ключи
и использовать его следующим образом:
_val = _keys[_a][_b]; // это двумерный массив
Этот подход не работает, если вы не знаете количество столбцов. заранее.
Если вы хотите использовать сглаженный (1D) массив, параметр
конструктор должен быть простым int*
, и вы должны дать ему
адрес первого элемента исходного 2D-массива:
Key key(&keyss[0][0], rows, cols, inp, a, b, c);
Недостаток использования сглаженного массива заключается в том, что для доступа к элементы, вы должны выполнить явные вычисления индекса:
_val = _keys[_a*_cols + _b];
- Не удается заставить клавиатуру использовать Keyboard.write на Arduino Uno
- Библиотека клавиатуры не работает или я где-то ошибаюсь
- Как подключить Wi-Fi Shield ESP-12E-ESP8266-UART-WIFI-Wireless-Shield к Arduino
- Глобальные переменные занимают много места в динамической памяти.
- Статус выхода 1 ожидаемое первичное выражение перед ']' Arduino
- Невозможно использовать библиотеку клавиатуры с Arduino UNO даже после смены прошивки.
- Ошибка: "'lcd' does not name a type" при использовании библиотеки LiquidCrystal.
- Могу ли я запретить библиотеке Stepper удерживать двигатель?
Я пробовал, но не знаю, как правильно, @Joseph Afodu
Спасибо, бро, я не понимал этого намного раньше, а также я новичок в программировании, но теперь я понимаю это лучше, @Joseph Afodu