2016-04-23 10 views
0

ich zur Zeit die folgende Meldung erhalte:Nicht-Klasse Typ Fehler und Pointer gibt

Fehler erhalten von Arduino IDE: Anfrage Mitglied ‚EEPROMWriteAny‘ in ‚eType‘, die von Nicht-Klasse-Typ ' EEPROMAnyType() '

Ich glaube nicht, dass ich die Variablen durch Verweis richtig in meinem Code übergeben, da dies das Hauptproblem ist, das den oben beschriebenen Fehler verursacht. Oder hat EEPROMWriteAny und EEPROM ReadAny in einer Klasse einer Klasse, was diesen Fehler verursacht? Muss ich aus der EEPROMAnyType-Klasse zeigen und dann auf die U-Klasse zeigen? Ist EEPROMReadAny selbst in einer geschachtelten Klasse?

Ich habe die Header-Datei, cpp Quelldatei, Arduino Beispielcode mit der EEPROM-Bibliothek und wie ich die Schlüsselwörter der folgenden Klassen definiert. Ich habe auch ein Bild davon geliefert, wie meine Bibliothek in ihrem Ordner aussieht, falls da etwas nicht stimmt.

Headerdatei:

#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-Datei:

#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 Code:

#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); 
} 

Hier ist, wie ich die Schlüsselwörter für die Klasse EPPROMAnyType definiert:

enter image description here

+1

'EEPROManyType eType();' sollte 'EEPROManyType eType;' sein, wenn Sie eine Instanz haben möchten. Andernfalls deklarieren Sie nur eine Funktion namens 'eType'. –

Antwort

0

EEPROManyTyp eTyp(); - Der Compiler würde diese Anweisung als Funktionsdeklaration mit dem Namen als eType und seinem Rückgabetyp als EEPROMAnyType interpretieren. eType wäre daher keine Instanz von EEPROMAnyType und jede Verwendung von eType im Sinne einer Instanz einer Klasse würde den Fehler erzeugen. Hoffe das hilft.

+0

Großartig! Vielen Dank! Ich habe eine Reihe anderer Probleme mit dem Code gefunden. Aber ich arbeite jetzt durch sie. Wenn ich wieder festsitze, werde ich wieder posten. –