Делаем библиотеку для ардуино

Я изучаю создание библиотек на 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(){
}

Как мне использовать функцию или библиотеку для обращения к массиву, заданному пользователем?

Пожалуйста, как мне это сделать?

Выдает эту ошибку сообщение об ошибке

, 👍0


1 ответ


Лучший ответ:

2

Ваша переменная 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];
,

Я пробовал, но не знаю, как правильно, @Joseph Afodu

Спасибо, бро, я не понимал этого намного раньше, а также я новичок в программировании, но теперь я понимаю это лучше, @Joseph Afodu