Mehrer Klassen/Libraries verknüpfen

Hallo, ich habe wieder mal ein kleines Problem.

Ich wollte durch ein Arduinoprogramm eine selbstgeschriebene librarie aufrufen, welche wiederum eine Methode einer anderen librarie aufrufen sollte. Mein Problem, jede librarie ist einzeln ansprechbar über mein Programm, also funktionieren sie, allerdings bekomme ich es nicht hin, das die eine librarie auf die andere zugreift. Ich binde in der Header Datei jeweils die andere mit ein und auch im Programm. Daraum meine Frage, wie funktioniert das den grundsätzlich? hat irgendjemand ein Beispiel dazu, oder eine Idee????

viele Grüße Ominum

Meistens ist es so, dass du von der einen Klasse ein Objekt erstellst wird und dieses an die nächste Klasse weiter über den Funktionskopf weitergegeben wird.

Alternative könntest du mit statischen Variablen innerhalb der Klassen arbeiten. Das ist nicht die sauberste Lösung.

Hallo,

ja das hab ich versucht. Ich habe meine beiden Klassen Test1 und Test2. Ich rufe jetzt in Test2.cpp den Konstruktor aus Test1.cpp auf mit Test1 beispiel(Wert)

Übergeben wird hier eine Zahl welche für einen digitalen Pin benötigt wird. Soweit so gut, mein Programm gibt keine Fehler zurück.

Wenn ich jetzt allerdings eine Methode anlege in der Test2.cpp z.B.

void Test2::umschalten() { beispiel.on() //ist eine Methode in Test1 }

bekomme ich die Fehlermeldung 'beispiel' was not declared in this scope

deswegen nochmal die Frage, kann mir jemand ein Beispiel zeigen/verlinken etc. wo sowas die Richtung mal umgesetzt wurde??

vg Ominum

Befindet sich die Methode "on" der Klasse Test1 im public oder im private Bereich?

Befindet sich im public Bereich

Ich hänge mal eine Klasse von mir an (siehe Anhang).

In dieser Klasse verwende ich zwei Objekte aus anderen Klassen, mit denen ich dann auch arbeite.

In der *.pde Datei im Anhang befindet sich der Aufruf aus der Arduino Umgebung.

LCDMenu2.h (1.97 KB)

LCDMenu2.cpp (4.02 KB)

LCDMenu2.pde (4.15 KB)

Hm,

da blick ich ehrlich gesagt nicht so ganz durch,
ich lad mal kurz meine dateien hoch, kurze beschreibung:
ich habe test1.h test1.cpp test2.h test2.cpp und die pde datei.

ich will jetzt von der pde datei aus ein Objekt der Klasse test2 erstellen welches beim erstellen gleichzeitig ein objekt der klasse test1 erstellt auf dessen Methoden ich dann zugreifen kann mit der pde datei.

wenn ichs so kompiliere klappt noch alles, sobald ich aber in test2.cpp das kommentarzeichen in der funktion wegmache klappt gar nichts mehr. wär echt nett wenn du das mal anschauen könntest, ich steh total auf dem schlauch

hochladen.rar (1021 Bytes)

Also wie ich nun ein neues Objekt in der anderen Klasse erstellen kann weiß ich auch nicht. Ich habe meine Objekte bei dem Beispiel in der *.pde erstellt und über den Konstruktor an die nächste Klasse weitergegeben.

Das Beispiel von dir habe ich mir angeschaut, aber da blick ich so schnell auch nicht durch ohne, dass ich das testen kann.

Naja, das Objekt erstellen klappt ja fehlerfrei. Hab mittlerweile mal den Konstruktoraufruf von Test1.cpp in den Konstruktor von Test2.cpp integriert. Jetzt kann ich auch die Methoden aus Test1 aufrufen. Allerdings passiert nichts????? Langsam versteh ich echt nichts mehr.

Hallo, ich hatte ein ähnliches Problem mit dem Touch-LCD von Watterott. Ich wollte da auch eine eigene Library erstellen, die originale aber beibehalten und mit meiner Lib darauf zugreifen. Das Grundgerüst meiner Lösung mit Pointern sieht so aus (incl. Mini-function mylcd.clear) :

mylcd.h

#ifndef mylcd_h
#define mylcd_h

#include "WConstants.h"
#include "MI0283QT2.h"

typedef MI0283QT2 *lcdPtr;

class mylcd
{
  
  public:
    lcdPtr lcd;
    void clear( byte Nr);
};

#endif

mylcd.cpp

#include "MI0283QT2.h"
#include "WProgram.h"
#include "mylcd.h"

mylcd::mylcd(lcdPtr _lcd)
{this->lcd = _lcd;}

void mylcd::clear(byte Nr)
{;this->lcd->setArea(0,0,100,100);
  this->lcd->clear(RGB(0,0,0));
  delay(1000);
}

Ich hoffe es hilft Dir weiter....

mfg Reinhard

Hallo,

also das haut bei mir nicht so richtig hin. Bin allerdings wieder ne Stufe weiter bei meinem ursprünglichen versuch. Mein erster Fehler war, dass ich beim einbinden der test1.h und test2.h in der jeweils anderen datei den genauen pfad der datei angeben musste. Was jetzt noch Probleme macht ist, dass ich die Funktion void on(); nur benutzen kann wenn ich sie direkt im Konstruktor von Test2 stehen habe. Das verrückte ist auch, dass wenn ich den an den konstruktor von test2 übergebenen wert in einer variable speichere und mit dieser dann den konstruktor von test1 aufrufe funktioniert wiedermal gar nichts. Nicht mal ein Fehler. Falls irgendjemand ne idee hat woran das liegen könnte und wie man das löst schließ ich ihn/sie ins nachtgebet mit ein ;-) vg

ominum: Ich rufe jetzt in Test2.cpp den Konstruktor aus Test1.cpp auf mit Test1 beispiel(Wert)

Wenn Du das so in Deinem Konstruktor stehen hast, ist "beispiel" eine lokale Variable auf das Objekt. Nach der Beendigung des Konstruktors ist die Variable auch weg und nicht mehr definiert. Daher auch die Fehlermeldung.

Du musst für die Klasse Test2 in der Headerdatei eine Zeigervariable vom Typ Test1 definieren:

Test1 *bspPtr;

Anschließend im Konstruktor das Objekt erzeugen und der Variable zuweisen:

Test1 beispiel(Wert);
bspPtr = &beispiel;

Auf die Klassenmethoden greifst Du dann so zu:

bspPtr->on();

Hallo,
und erstmal vielen DANK, das hat mich ein gutes Stück weitergebracht.
Häng aber leider immer noch ein bisschen, so wie dus beschrieben hast funktionierts, allerdings nur beim ersten aufruf vom Programm.

Ich habe noch eine Methode off reingehängt, 2 pins übergeben und möchte von meinem Programm aus jetzt die Led einschalten (was problemlos funktioniert), wenn ich sie allerdings wieder ausschalten will leuchtet sie einfach weiter. Ich hab das ganze programm mit klassen mal im anhang beigefügt.

und ich häng seit stunden dran undich find einfach keinen Fehler.

vg

klassen.rar (1.27 KB)

nächstes Problem das ich eben endtdeckt habe:

Am Arduino selbst geht nach upload des Programmes auch immer die LED13 an, obwohl die im Programm und den Klassen nicht mal erwähnt wird.
Also langsam verzweifle ich echt!!!

ominum: Hallo, und erstmal vielen DANK, das hat mich ein gutes Stück weitergebracht. Häng aber leider immer noch ein bisschen, so wie dus beschrieben hast funktionierts, allerdings nur beim ersten aufruf vom Programm.

Ich habe noch eine Methode off reingehängt, 2 pins übergeben und möchte von meinem Programm aus jetzt die Led einschalten (was problemlos funktioniert), wenn ich sie allerdings wieder ausschalten will leuchtet sie einfach weiter. Ich hab das ganze programm mit klassen mal im anhang beigefügt.

und ich häng seit stunden dran undich find einfach keinen Fehler.

vg

Ich hab mir Deinen Source mal angesehen. Du schaltest Grün an, wartest zwei Sekunden, und schaltest Grün wieder aus. Nachdem hier Deine Funktion zuende ist, fängt an dieser Stelle loop() sofort wieder von vorne an (warum heisst die Funktion wohl "loop"?). Somit wird im selben Moment Grün wieder eingeschaltet und Du bekommst das Ausschalten überhaupt nicht mit.

Hi,

das meinte ich nicht mit dem Fehler. Versuch doch bitte mal zwischen grün an und grün aus ein delay(2000); oder irgendwas anderes dazwischen zu machen. Dann passiert nämlich nichts mehr, der befehl ausschalten wird einfach ignoriert. Und es ist egal welchen befehl ich dazwischen mache. ob ich jetzt ne ausgabe mache über Serial.println oder sonstiges.

ich verstehs einfach nicht.

vg

Wenn in der RAR-Datei Dein aktueller Source ist, dann ist dies sehr wohl der Fehler. Du hast das Problem, dass die LED nicht mehr ausgeht. Da ist es doch egal, was zwischen an und aus ist. Mach mal nach Grün aus noch ein Delay(2000).

Erstmal vielen Dank für deine Hilfe,
aber leider funktioniert das nicht, er reagiert wirklich nicht mehr auf den befehl zum ausschalten.
ich hab nochmal den aktuellen code angehängt. Überzeug dich selbst.

vg

hochladen.rar (1.28 KB)

Ich hab jetzt Grad keine Zeit. Ich sehs mir später aber an.

Danke