У меня проблема с передачей массива в функцию, которая содержится в библиотеке. Я использую Arduino IDE 16.7.
Если я передам переменную не-массив / не-указатель, то код прекрасно компилируется.
Я думаю, что я сделал основной недостаток с моими адресами указателей. Но я не вижу, что это
Вот ошибки, которые я получаю:
недопустимое преобразование из ‘char *’ в ‘uint8_t {aka unsigned char}’ [-fpermissive]
инициализирующий аргумент 2 ‘void EEPROMClass :: write (int, uint8_t)’ [-fpermissive]
Обе эти ошибки связаны с библиотекой EEPROM Arduino, которую я использую.
Компилятор, похоже, не согласен с моей передачей массива / указателя в библиотеку EEPROm следующим образом … Почему?
H файл:
#ifndef EEPROMAnyType_h
#define EEPROMAnyType_h
#include <Arduino.h>
#include <EEPROM.h>
template <class E>
class EEPROMAnyType
{
public:
int EEPROMReadAny(unsigned int addr, E x); //Reads any type of variable EEPROM
int EEPROMWriteAny(unsigned int addr, E x);//Writes any type of variable to EEPROM
// EEPROMAnyType(unsigned int addr, E x);
};
//#include "EEPROMAnyType.cpp"#endif
CPP файл:
#include <Arduino.h>
#include <EEPROM.h>
#include "EEPROMAnyType.h"template <class E>
int EEPROMAnyType<E>::EEPROMReadAny(unsigned int addr, E x)
{
union{
byte b[sizeof(x)];
E y;//generaltype y //have a variable that has no type here(using a tempplate???)
};
int i;
x = x; //assign x to y( a variable of no type) which should be n the union
y = x;
for(i = 0; i < sizeof(y); i++){ // Why can I not declare i as an integer in the for loop?
b[i] = EEPROM.read(addr+i);
}
return i;
}
template <class E>
int EEPROMAnyType<E>::EEPROMWriteAny(unsigned int addr, E x)
{
union{
byte b[sizeof(x)];
E y;//generaltype y //have a variable that has no type here(using a tempplate???)
};
int i = 0;
y = x;
for(i = 0; i < sizeof(y); i++){
EEPROM.write(addr+i, y);
}
return i;
}
Файл INO (реализует библиотеку):
#include <Arduino.h>
#include <EEPROM.h>
#include <EEPROMAnyType.h>
#include <EEPROMAnyType.cpp>
int addressCharArray;
const int writes = 80;
const int memBase = 350;
unsigned int eeaddrPASS;
unsigned int eeaddrSSID;
char eePASS[writes];
char eeSSID[writes];
EEPROMAnyType<char*> eepblueString;//instantiates EEPROMANyType class
boolean check = false;
void setup(){
if (check = true){
EEPROMwifiUpdate(eeaddrPASS, eeaddrSSID, eePASS, eeSSID);
}
}
void loop(){
EEPROMwifiRead(eeaddrPASS, eeaddrSSID, eePASS, eeSSID);
}
void EEPROMwifiUpdate(unsigned int writeaddrPASS, unsigned int writeaddrSSID, char writePASS[writes], char writeSSID[writes]){
eepblueString.EEPROMWriteAny(writeaddrPASS, writePASS);
eepblueString.EEPROMWriteAny(writeaddrSSID, writeSSID);
}
void EEPROMwifiRead(unsigned int readaddrPASS, unsigned int readaddrSSID, char readPASS[writes], char readSSID[writes]){
eepblueString.EEPROMReadAny(readaddrPASS, readPASS);
eepblueString.EEPROMReadAny(readaddrSSID, readSSID);
}
В этом звонке
for(i = 0; i < sizeof(y); i++){
EEPROM.write(addr+i, y);
}
y
это (если я не ошибаюсь) типа char[]
(более менее char *
) и второй фрагмент EEPROM.write()
должно быть (согласно сообщению об ошибке) uint8_t
(похоже на char
)
Я полагаю, вы должны написать что-то вроде
for(i = 0; i < sizeof(y); ++i){
EEPROM.write(addr+i, y[i]);
}
или (используя союз)
for(i = 0; i < sizeof(b); ++i){
EEPROM.write(addr+i, b[i]);
}
как в EEPROMReadAny()
,
Несвязанное предложение: принимая во внимание, что вы противостоите этому с беззнаковым значением (sizeof(y)
) лучше определить i
(в EEPROMReadAny()
И в EEPROMWriteAny()
) unsigned
или же std::size_t
,
p.s .: извините за мой плохой английский.
— РЕДАКТИРОВАТЬ —
Второй вопрос: ошибка «неверное преобразование из ‘char *’ в ‘char’ [-fpermissive] eepBLEtoothchar.EEPROMReadAny (readaddrSSID, readSSID);»
Я не понимаю эту ошибку, но … я вижу пару других проблем.
Я проблема
Вы определяете eepblueString
EEPROMAnyType<char*> eepblueString;
как EEPROMAnyType<char*>
, Итак, в EEPROMAnyType<E>
тип E
это char *
, А также sizeof(E)
4 (или 8, если вы работаете на 64-битной платформе).
Когда вы проходите readPASS
а также readSSID
, они есть char[80]
Итак, я полагаю, ваше намерение читать 80 символов. Но ваш объект пытается прочитать только 4 (или 8) символов.
II проблема
Второй аргумент EEPROMReadAny()
проходит мимо значение; так что вы можете прочитать 4 (или 8) символа, но они будут свободными при выходе из метода. Чтобы сохранить прочитанные символы, вы должны передать второй аргумент по ссылке.
Вам действительно нужно EEPROMAnyType
?
Я имею в виду: если EEPROMReadAny()
может быть простой функцией, вы можете вывести E
введите из второго аргумента, избегая первой проблемы.
Я предлагаю следующее решение (следует решить проблему II, передав второй аргумент по ссылке)
template <class E>
int EEReadAny (unsigned int add, E & x)
{
char * b = (char *)&x;
for ( unsigned ui = 0U ; ui < sizeof(E) ; ++ui )
b[ui] = EEPROM.read(addr+i);
return sizeof(E);
}
Других решений пока нет …