Stránka 1 z 1
Společný objekt
Napsal: 23 čer 2020, 16:43
od PetrB
Ahoj,
je možné definovat a vytvořit jeden objekt, který by jiné rutiny v jiných knihovnách mohli používat?
Jedná se mi vlastně o globální proměnnou, definovanou třeba v knihovně 1
knihovna1
Kód: Vybrat vše
#pragma once
#ifndef _KNIHOVNA1_h
#define _KNIHOVNA1_h
class objekt1 {
public:
objekt1() { nějaký constructor
}
void pracuj() {něco udělám}
};
tady nějak ten objekt vytvořím objekt1 SpolecnyObjekt(); nebo alespoň nasdílím společnou proměnnou. Objekt vytvořím až v Setupu.
#endif
knihovna2
Kód: Vybrat vše
#include "knihovna1"
....
SpolecnyObjekt.pracuj();
....
Sketch.ino
Kód: Vybrat vše
#include "knihovna1"
...
void loop() {
SpolecnyObjekt.pracuj();
}
...
Vím, že vytváření globálních proměnných není zrovna ideální, ale občas se to hodí. Mohl bych to "očůrat" tím, že bych si proměnnou vytvořil "nahoře" ve Sketchi a předával ji jednotlivým knihovnám/objektům jako parametr, ale to mi přijde také dost pitomé. Více by se mi líbilo mít někde definovaný ten jeden objekt, a odkudkoliv bych jej mohl zavolat.
Díky
Pb
Re: Společný objekt
Napsal: 23 čer 2020, 16:52
od kiRRow
Vytváření globálních proměnných je nezbytné a velmi důležité. Programátor pozná co příjde do globální paměti a co ne.
Objekt vzniká jako dynamická instance třídy. Ostatní rutiny s objektem pracují tak, že volají jeho veřejné vnitřní funkce (metody).
Takže ano. Je možné, aby s jedním objektem pracovalo více rutin. Zároveň je možné, aby jedna rutina uměla pracovat s více objekty.
Re: Společný objekt
Napsal: 23 čer 2020, 17:41
od KamilV
Moc jsem nepochopil, co je cílem, ale ano, objekt může pracovat s globální proměnnou, resp. je to závislost, kterou by měl ten objekt dostat v konstruktoru jako pointer.
Nepochopil jsem, kde "knihovna2" vezme info o tom, že "SpolecnyObjekt" je instancován. Spoléhání se na to, že bude existovat v globálním prostředí, bude nešikovné a použitelnost takové knihovny bude velmi nízká.
Re: Společný objekt
Napsal: 23 čer 2020, 18:37
od gilhad
Takhle to Arduino normalne dela, napriklad Serial, Wire a dalsi.
V hlavicce definujes
Kód: Vybrat vše
#ifndef _KNIHOVNA1_h
#define _KNIHOVNA1_h
class objekt1 { // tady reknes, jak bude vypadat
public:
objekt1();
void pracuj();
};
extern objekt1 SpolecnyObjekt; // tady reknes, ze ho "nekdo nekde" vytvori
#endif
v implementaci
Kód: Vybrat vše
#include "knihovna1.h"
objekt1::objekt1(){
// nejak se construktoruje
}
void objekt1::pracuj() {
// neco pracuje
}
//
objekt1 SpolecnyObjekt=objekt1(); // tady se vytvori
a pak kdekoli uz jen
Kód: Vybrat vše
#include "knihovna1.h"
....
void loop(){
SpolecnyObjekt.pracuj();
.....
}
Kód: Vybrat vše
#include "knihovna1.h"
....
void nejaka_funkce(){
....
SpolecnyObjekt.pracuj();
.....
}
Re: Společný objekt
Napsal: 23 čer 2020, 23:45
od PetrB
Díky gilhade, takhle jsem to myslel (p.s. o tom, že globální proměnné existují samozřejmě vím, jenom to neumím napsat v zrovna pro Arduino - a česky jsem to popsal taky asi dost blbě , jak koukám).
Tak jsem to i zkoušel (v jedné z variant) ale psalo mi to nějaká sprostá slova ohledně násobnosti objektu nebo něčeho takového. A pak už jsem bloudil dokolečka. Zkusím to ještě jednou podle Tvého návodu.
Díky
P.S. snažím se vytvořit malý monitor časové náročnosti vybraných rutin. Prostě mám program, který na můj vkus běží hodně pomalu, tak se snažím zjistit, které rutiny se "flákají". No a jsem línej pořád psát rozdíly millis() případně micros(). Mám malý objekt, který eviduje počet vyvolání, a strávený čas. A chtěl bych, abych si ho mohl lehce volat z kterékoliv rutiny projektu.
Re: Společný objekt
Napsal: 24 čer 2020, 00:10
od PetrB
Tak se mi to povedlo přeložit a rozběhnout. Na začátku jsem měl chybu v té inicializaci. No a pak jsem začal zkoušet všechno možné a šlo to do...
Díky
Pb