Go Down

Topic: Libraries in selbst geschriebener Librarie (Read 1 time) previous topic - next topic

cr0n0s1

Tachen,

hab momentan folgendes Problem: Ich versuch die Lib LiquidCrystal.h in meine eigene Lib (MenuFrame.h) einzubinden. Bekomme allerdings beim compelieren einen Fehler. Jetzt hab ich im Netz schon was über das einbinden von Libs in eigene Libs gelesen und erfahren, dass die Arduino IDE damit wohl nicht ganz klar kommt. Hat jemand ne Lösung um das Problem zubeheben?


MFG cr0n0s1

mkl0815

Naja, wenn Du die Fehler posten würdest, die Du da bekommst, könnte man sicher versuchen sich einen Reim darauf zu machen.
Aber ohne weitere Infos müssen wir wohl auf die Kristallkugel von Uwe warten  ;)

uwefed

Quote
Aber ohne weitere Infos müssen wir wohl auf die Kristallkugel von Uwe warten   ;)

Tut mir leid, habe das Kontingent für diesen Monat schon ausgescöpft. Kann leider die Kristallkugen nicht befragen.  ;) ;) ;) ;)
Viele Grüße Uwe

michael_x

Quote
Jetzt hab ich im Netz schon was über das einbinden von Libs in eigene Libs gelesen und erfahren, dass die Arduino IDE damit wohl nicht ganz klar kommt. Hat jemand ne Lösung um das Problem zubeheben?

Und die Lösung, die du da doch auch gelesen haben solltest, geht nicht?

Sieht dein Sketch so aus:
#include <LiquidCrystal.h> // auch wenn's eigentlich gar nicht gebraucht wird
#include "MenuFrame.h"     // hat selbst ein #include <LiquidCrystal.h> , das reicht aber nicht für die IDE

cr0n0s1

Jap habs so eingebuden. Kann euch auch mal den Fehler geben den ich dann bekomme.


MenuFrame.cpp: In constructor 'MenuFrame::MenuFrame()':
MenuFrame.cpp:2: error: no matching function for call to 'LiquidCrystal::LiquidCrystal()'
C:\Dokumente und Einstellungen\lukas\Eigene Dateien\Downloads\arduino-1.0.1-windows\arduino-1.0.1\libraries\LiquidCrystal/LiquidCrystal.h:56: note: candidates are: LiquidCrystal::LiquidCrystal(uint8_t, uint8_t, uint8_t, uint8_t, uint8_t, uint8_t)
C:\Dokumente und Einstellungen\lukas\Eigene Dateien\Downloads\arduino-1.0.1-windows\arduino-1.0.1\libraries\LiquidCrystal/LiquidCrystal.h:54: note:                 LiquidCrystal::LiquidCrystal(uint8_t, uint8_t, uint8_t, uint8_t, uint8_t, uint8_t, uint8_t)
C:\Dokumente und Einstellungen\lukas\Eigene Dateien\Downloads\arduino-1.0.1-windows\arduino-1.0.1\libraries\LiquidCrystal/LiquidCrystal.h:52: note:                 LiquidCrystal::LiquidCrystal(uint8_t, uint8_t, uint8_t, uint8_t, uint8_t, uint8_t, uint8_t, uint8_t, uint8_t, uint8_t, uint8_t)
C:\Dokumente und Einstellungen\lukas\Eigene Dateien\Downloads\arduino-1.0.1-windows\arduino-1.0.1\libraries\LiquidCrystal/LiquidCrystal.h:49: note:                 LiquidCrystal::LiquidCrystal(uint8_t, uint8_t, uint8_t, uint8_t, uint8_t, uint8_t, uint8_t, uint8_t, uint8_t, uint8_t)
C:\Dokumente und Einstellungen\lukas\Eigene Dateien\Downloads\arduino-1.0.1-windows\arduino-1.0.1\libraries\LiquidCrystal/LiquidCrystal.h:45: note:                 LiquidCrystal::LiquidCrystal(const LiquidCrystal&)

mkl0815

Dein Problem ist nicht, das die Lib nicht gefunden wird, sondern das Du den Konstruktor der LiquidCrystal Klasse falsch aufrufst.
Dieser erwartet, wie die Fehlermeldung auch besagt wenigstens 6 Parameter, nämlich die Pins an denen das Display hängt.

Ein Aufruf von 'LiquidCrystal::LiquidCrystal()' in Deinem Konstruktor der Klasse MenuFrame geht so also nicht. hier solltest Du auch auch die entsprechenden Pins übergeben, bzw. ein fertig initialisiertes Objekt von LiquidCrystal übergeben.
Letzteres wäre taktisch günstiger, da der User ja ggf. das Display auch direkt ansprechen will.

cr0n0s1


Ein Aufruf von 'LiquidCrystal::LiquidCrystal()' in Deinem Konstruktor der Klasse MenuFrame geht so also nicht. hier solltest Du auch auch die entsprechenden Pins übergeben, bzw. ein fertig initialisiertes Objekt von LiquidCrystal übergeben.
Letzteres wäre taktisch günstiger, da der User ja ggf. das Display auch direkt ansprechen will.


Daran hab ich auch gedacht. Allerdings muss ich doch dann in meiner Klasse ein LCD Objekt anlegen um das übergeben Objekt dort hinzukopieren oder wie soll ich die sache angehen?

mkl0815

Nein, Deine Klasse "MenuFrame" hat ein Member-Variable die kein Objekt der Klasse LiquidCrystal ist, sondern nur ein Zeiger darauf.

Also statt

LiquidCrystal myLCD;
einfach
LiquidCrystal *myLCD = 0;

Zusätzlich bekommt Deine Klasse einen Konstruktor
Code: [Select]

MenuFrame::MenuFrame(LiquidCrystal *lcd) {
    this->myLCD = lcd;
}

Damit kann beim Erzeugen von MenuFrame das LCD gleich übergeben werden.
Zusätzlich kannst Du das aber auch Deine Klasse machen lassen:
Code: [Select]

MenuFrame::MenuFrame(uint8_t a, uint8_t b, uint8_t c, uint8_t d, uint8_t e, uint8_t f) {
    this->myLCD = new LiquidCrystal(a,b,c,d,e,f);
}

Damit kann der Nutzer selbst entscheiden, ob er Deine Klasse das LCD erzeugen lassen will, oder ob er sein eigenes Objekt übergibt. Ein weiterer Vorteil ist, das im Fall das mehr als ein MenuFrame Objekt erzeugt wird, das gleiche LiquidCrystal Objekt an beide übergeben werden kann, was wieder Speicher spart.

Wichtig ist, das Du innerhalb Deiner Klasse die LCD-Methoden dann mit dem "->" Operator und nicht mehr mit dem "." Operator ansprechen musst.

Code: [Select]

statt
myLCD.setCursor(0, 1);
jetzt
myLCD->setCursor(0, 1);

cr0n0s1

Vielen Dank ;) hat mir sehr weitergeholfen. Bei Intresse kann ich die Lib auch vorstellen. (Nach einigen Tests natürlich)

mkl0815

Es wäre schön, wenn Du die Lib hier vorstellen könntest. Besser noch wäre eine Veröffentlichung unter der GPL oder LGPL, damit jeder der sie verwendet auch "rechtlich" sicher ist. "Public Domain" geht natürlich auch.

Go Up