Ошибка компиляции при передаче массива / указателей в процедуру в библиотеке

У меня проблема с передачей массива в функцию, которая содержится в библиотеке. Я использую 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);
}

1 ответ

Решение

В этом звонке

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)) лучше определить iEEPROMReadAny() И в EEPROMWriteAny()) unsigned или же std::size_t,

PS: извините за мой плохой английский.

--- РЕДАКТИРОВАТЬ ---

Второй вопрос: ошибка "неверное преобразование из '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);
 }
Другие вопросы по тегам