Společný objekt

Wiring, C++, C, Java, ...
Pravidla fóra
Toto subfórum slouží k řešení obecných otázek kolem programování (konstrukce, knihovny, alokace paměti, ...)
Odpovědět
PetrB
Příspěvky: 141
Registrován: 20 čer 2018, 13:39
Reputation: 0

Společný objekt

Příspěvek od PetrB » 23 čer 2020, 16:43

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

Uživatelský avatar
kiRRow
Příspěvky: 1151
Registrován: 07 kvě 2019, 07:03
Reputation: 0
Bydliště: Opava

Re: Společný objekt

Příspěvek od kiRRow » 23 čer 2020, 16:52

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.

KamilV
Příspěvky: 479
Registrován: 03 dub 2018, 15:27
Reputation: 0
Bydliště: Olomouc

Re: Společný objekt

Příspěvek od KamilV » 23 čer 2020, 17:41

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

Uživatelský avatar
gilhad
Příspěvky: 778
Registrován: 07 bře 2018, 11:22
Reputation: 0

Re: Společný objekt

Příspěvek od gilhad » 23 čer 2020, 18:37

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();
.....
}

PetrB
Příspěvky: 141
Registrován: 20 čer 2018, 13:39
Reputation: 0

Re: Společný objekt

Příspěvek od PetrB » 23 čer 2020, 23:45

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.

PetrB
Příspěvky: 141
Registrován: 20 čer 2018, 13:39
Reputation: 0

Re: Společný objekt

Příspěvek od PetrB » 24 čer 2020, 00:10

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

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 6 hostů