Forum: Projekte & Code Problem Template Arduino 1.6.1 IDE


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Meik J. (tidemic)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.