В настоящее время я получаю следующее сообщение:
Ошибка при получении из Arduino IDE:
запрос на член ‘EEPROMWriteAny’ в ‘eType’, который имеет тип не-класса ‘EEPROMAnyType ()’
Я не думаю, что я передаю переменные по ссылке должным образом в моем коде, так как это то, что, кажется, является основной проблемой, которая вызывает ошибку, написанную выше.
Или имеет EEPROMWriteAny и EEPROM ReadAny в классе класса, что вызывает эту ошибку? Нужно ли указывать на класс EEPROMAnyType, а затем указывать на класс U? EEPROMReadAny даже во вложенном классе?
Я предоставил файл заголовка, исходный файл cpp, пример кода arduino с использованием библиотеки EEPROM и то, как я определил ключевые слова классов ниже.
Я также предоставил изображение того, как моя библиотека выглядит в ее папке на случай, если с этим что-то не так.
Заголовочный файл:
#ifndef EEPROMAnyType_h
#define EEPROMAnyType_h
#include <Arduino.h>
#include <EEPROM.h>
class EEPROMAnyType
{
public:
template <class U> int EEPROMReadAny(unsigned int addr, U& x); //Reads any type of variable EEPROM
template <class U> int EEPROMWriteAny(unsigned int addr, U& x);//Writes any type of variable to EEPROM
private:
int i;
const byte *p[];
byte *p[];
};
#endif
CPP файл:
#include "Arduino.h"#include "EEPROM.h"#include "EEPROMAnyType.h"
template <class U> int EEPROMAnyType::EEPROMReadAny(unsigned int addr, U x)
{
int i;
byte* p[sizeof(x)] = (byte*)(void*) x; //(void*) makes variable x "typeless" and then (byte*) casts the typeless variable as a byte type
for(i = 0; i < sizeof(x); i++){ // Why can I not declare i as an integer in the for loop?
p[i]= EEPROM.read(addr+i);
}
return i;
}
template <class U> int EEPROMAnyType::EEPROMWriteAny(unsigned int addr, U x)
{
int i = 0;
const byte* p[i] = (const byte*)(const void*) x;
for(i = 0; i < sizeof(x); i++){
EEPROM.write(addr+i, p[i]);
}
return i;
}
Код Arduino:
#include <Arduino.h>
#include <EEPROM.h>
#include <EEPROMAnyType.h>EEPROMAnyType eType(); // used to call EEPROMAnyType which can write/read any kind of data type to/from EERPOM
int addr = 10; //memory location to be pass by value to EEPROMAnyType functions
String *p;// To pass by reference to EEPROMAnyType functions
String x; //will be assigned to EEPROM location
void setup() {
x = "memory";
p = &x;
Serial.begin(9600);
Serial.println("Hello World"); //shows start point of code
eType.EEPROMWriteAny(addr, *p); //Writes to EEPROM memory 10
x = eType.EEPROMReadAny(addr, *p); //assigns bytes from EEPROM memory location to x
}
void loop() {
Serial.print("x: ");
Serial.println(x);
Serial.print("no. of bytes stored in x: ");
Serial.println(EEPROMWriteAny(addr, p));
delay(1000);
}
Вот как я определил ключевые слова для класса EPPROMAnyType:
EEPROMAnyType KEYWORD1
EEPROMReadAny KEYWORD2
EEPROMWriteAny KEYWORD2
EEPROMAnyType eType (); — компилятор интерпретирует это утверждение как объявление функции с именем как eType, а его тип возвращаемого значения — как EEPROMAnyType. Следовательно, eType не будет экземпляром EEPROMAnyType, и любое использование eType в смысле экземпляра класса приведет к ошибке. Надеюсь это поможет.
Других решений пока нет …