2016-04-23 6 views
0

В настоящее время я получаю следующее сообщение:ошибки типа Non-класс, и Pointer вопросы

Ошибки получать от 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 

enter image description here

+1

'EEPROMAnyType eType();' должен быть 'EEPROMAnyType eType;', если вы хотите иметь экземпляр. В противном случае вы просто объявляете функцию с именем 'eType'. –

ответ

0

EEPROMAnyType eType(); - компилятор интерпретирует этот оператор как объявление функции с именем как eType, а тип возврата - как EEPROMAnyType. Таким образом, eType не будет экземпляром EEPROMAnyType, и любое использование eType в смысле экземпляра класса приведет к ошибке. Надеюсь это поможет.

+0

Отлично! Спасибо! Я нашел ряд других проблем с кодом. Но сейчас я работаю над ними. Если я снова застрял, я обязательно отправлю сообщение. –

 Смежные вопросы

  • Нет связанных вопросов^_^