Forum: Projekte & Code Problem Template Arduino 1.6.1 IDE


von Meik J. (tidemic)


Lesenswert?

Hallo Community,
ich habe ein Problem ein Template auf meinen Arduino UNO
umzusetzen. Und erbitte hiermit um Rat von euch.
----------------------------------------------------------------------
//TemplateClass2.ino
#include "Header.h"
void setup() {
  // put your setup code here, to run once:
Serial.begin(9600);
}
//Instanz anlegen
Schatztruhe <int> EineTruhe;

void loop() {
 //FEHLER? WARUM?
 EineTruhe.setSchatz(12);
              //Und wieder ????
Serial.println( EineTruhe.getSchatz() ) ;
delay(750);
}
---------------------------------------------------------------------
//Header.h
#include"Arduino.h"
#ifndef HEADER_H
#define HEADER_H

template <typename T>
class Schatztruhe
{
 private:
 T schatz;
 public:
 void setSchatz(T In);
 T getSchatz();
};
#endif
----------------------------------------------------------------
//Code.cpp
#include"Header.h"

template <typename T>
void Schatztruhe<T>::setSchatz(T In)
{
  schatz = In;
}

template <typename T>
T Schatztruhe<T>::getSchatz()
{
  return schatz;
}
-----------------------------------------------------------------
Fehlermeldung Arduino IDE
Arduino: 1.6.1 (Windows 7), Platine: "Arduino Uno"

TemplateClass2.cpp.o: In function `loop':

C:\Program Files (x86)\Arduino/TemplateClass2.ino:12: undefined 
reference to `Schatztruhe<int>::setSchatz(int)'

C:\Program Files (x86)\Arduino/TemplateClass2.ino:14: undefined 
reference to `Schatztruhe<int>::getSchatz()'

collect2.exe: error: ld returned 1 exit status

Fehler beim Kompilieren.

Gruß Meik

: Bearbeitet durch User
von Meik J. (tidemic)


Lesenswert?

Kleiner Anhang noch. Alles in die X.ino und es läuft!?
--------------------------------------------------------
void setup() {
  // put your setup code here, to run once:
Serial.begin(9600);
}

template <typename T>
class Schatztruhe
{
  private:
  T schatz;
  public:
  void setSchatz(T s)
  {
    this->schatz=s;
  }
  T getSchatz()
  {
   return this->schatz;
  }
};

void loop() {
Schatztruhe <unsigned int> Zahl;
Schatztruhe <boolean> Bool;
Bool.setSchatz(true);
Zahl.setSchatz(1);

while(true)
          {
           Serial.print("Zahl= ");
           Serial.println(Zahl.getSchatz());
           Zahl.setSchatz( (Zahl.getSchatz()) +1);
           Serial.print("Bool= ");
           Serial.println(Bool.getSchatz());
           delay(750);
          }
}
--------------------------------------------------------------
So funktioniert es Anstandslos!!!

: Bearbeitet durch User
von 42 (Gast)


Lesenswert?

Templates kannst du nicht in einer Quellcode-Datei definieren, sondern 
nur im Header. Wie soll das denn gehen? Wie sonst soll der Kompiler die 
Methoden für den einen Typ generieren, wenn er den Code nicht kennt. 
Wenn du das nicht verstehst solltest du dir den Kompilieren-Linken 
Vorgang genauer ansehen.

von Meik J. (tidemic)


Lesenswert?

Erstmal Danke für die schnelle Antwort. ;)

Wie du mir das gerade erklärst  macht das schon,auch für mich 
Hobby-Informatiker, Sinn.

Soweit ich das mit der Aufteilung von den Modulen verstanden habe 
(ACHTUNG LAIE!). Da diese getrennt Kompiliert werden oder die x.cpp auch 
nur kompilert
vorliegt. Können die Methoden die zu Übergebenen Daten(Typen) noch gar 
nicht
kennen "Die sitzen ja auch nicht mit der Glasskugel auf dem Rummel ;)"!

Ich verstehe!!!

Dann dient der Syntax denn ich aus Fachliteratur habe. Wohl 
ausschließlich
dazu. Alles zwar in der selbe Header.h zuschreiben. Aber Deklaration und
Definition zu trennen.

//Header.h
template <T>
class Schatztruhe
{
 //Deklaration
};

template<T>
X Schatztruhe<T>::X()
{
 //Definition
}

SUPER!!!

Ich wünsche noch ein schönes Wochenende!

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.