Go Down

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

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