Pages: [1]   Go Down
Author Topic: Libraries in selbst geschriebener Librarie  (Read 1053 times)
0 Members and 1 Guest are viewing this topic.
Germany
Offline Offline
Newbie
*
Karma: 0
Posts: 33
IT-Systemelektroniker Azubi
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
Edison Member
*
Karma: 21
Posts: 1419
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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  smiley-wink
Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 271
Posts: 21872
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Aber ohne weitere Infos müssen wir wohl auf die Kristallkugel von Uwe warten   smiley-wink
Tut mir leid, habe das Kontingent für diesen Monat schon ausgescöpft. Kann leider die Kristallkugen nicht befragen.  smiley-wink smiley-wink smiley-wink smiley-wink
Viele Grüße Uwe
Logged

Germany
Offline Offline
Faraday Member
**
Karma: 59
Posts: 3071
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Germany
Offline Offline
Newbie
*
Karma: 0
Posts: 33
IT-Systemelektroniker Azubi
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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&)
Logged

Offline Offline
Edison Member
*
Karma: 21
Posts: 1419
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Germany
Offline Offline
Newbie
*
Karma: 0
Posts: 33
IT-Systemelektroniker Azubi
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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?
Logged

Offline Offline
Edison Member
*
Karma: 21
Posts: 1419
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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:
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:
statt
myLCD.setCursor(0, 1);
jetzt
myLCD->setCursor(0, 1);
Logged

Germany
Offline Offline
Newbie
*
Karma: 0
Posts: 33
IT-Systemelektroniker Azubi
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Edison Member
*
Karma: 21
Posts: 1419
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Pages: [1]   Go Up
Jump to: