Třída

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
ohruska
Příspěvky: 224
Registrován: 08 pro 2017, 20:56
Reputation: 0

Třída

Příspěvek od ohruska » 23 úno 2021, 12:13

Dobrý den.
Potřeboval bych poradit.
Pro řízení 16-cti serv přes I2C jsem použil třídu na řízení rychlosti serva.
Ukázka tady: https://www.digikey.com/en/maker/projec ... d542c46a28

Můj dotaz je, zda musím definovat každou novou třídu samostatně
Sweeper sweeper1(15);
Sweeper sweeper2(15);
nebo bych mohl definovat třídy nějak hromadně, třeba pomocí cyklu "For". Je to přece 16 serv.
sweeper1.Update();
sweeper2.Update();
Pak bych podobně možná mohl i volat třídy cyklem "For".

Děkuji za pomoc
Ota

ondraN
Příspěvky: 545
Registrován: 08 srp 2019, 20:01
Reputation: 1

Re: Třída

Příspěvek od ondraN » 23 úno 2021, 14:18

Šlo by to udělat přes pole objektů, ale bez bližší znalosti této problematiky, doporučuji spíše Ctrl-C,Ctrl-V a editaci :mrgreen:

ondraN
Příspěvky: 545
Registrován: 08 srp 2019, 20:01
Reputation: 1

Re: Třída

Příspěvek od ondraN » 23 úno 2021, 14:48

Tady je odkaz, jak s tím pracovat
https://www.codesdope.com/cpp-array-of-objects/

ohruska
Příspěvky: 224
Registrován: 08 pro 2017, 20:56
Reputation: 0

Re: Třída

Příspěvek od ohruska » 23 úno 2021, 17:21

Díky za pomoc.
Už mě to funguje
Ota

ondraN
Příspěvky: 545
Registrován: 08 srp 2019, 20:01
Reputation: 1

Re: Třída

Příspěvek od ondraN » 23 úno 2021, 18:19

Šikula :D

kiRRow
Příspěvky: 581
Registrován: 07 kvě 2019, 07:03
Reputation: 2
Bydliště: Opava

Re: Třída

Příspěvek od kiRRow » 26 úno 2021, 16:22

Třídu máš definovanou pouze jednou ... to co opakuješ je vytváření objektů dle dané třídy. A ano, ty musíš vytvořit každý zvlášť. Nedoporučuji v cyklu for, bude se ti špatně vytvářet objekty s různými parametry. Třeba třídě, která bude ovládat nějakou LEDku, musíš při každém vytvoření objektu sdělit, na kterém PINu se nachází LEDka.

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

Re: Třída

Příspěvek od KamilV » 26 úno 2021, 18:29

kiRRow píše:
26 úno 2021, 16:22
Třeba třídě, která bude ovládat nějakou LEDku, musíš při každém vytvoření objektu sdělit, na kterém PINu se nachází LEDka.
I piny mohou být v poli ;)

kiRRow
Příspěvky: 581
Registrován: 07 kvě 2019, 07:03
Reputation: 2
Bydliště: Opava

Re: Třída

Příspěvek od kiRRow » 01 bře 2021, 16:19

KamilV píše:
26 úno 2021, 18:29
kiRRow píše:
26 úno 2021, 16:22
Třeba třídě, která bude ovládat nějakou LEDku, musíš při každém vytvoření objektu sdělit, na kterém PINu se nachází LEDka.
I piny mohou být v poli ;)
Piny v datových polích a v proměnných je dle mého názoru tak akorát nešvár examplů. Piny se přece dávaj do define a s řádným komentářem. A i když chci jedinou funkcí projet cyklem for několik pinů, tak si je zapíšu do define a datové pole si stvořím až po tom a právě z těch define.

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

Re: Třída

Příspěvek od KamilV » 01 bře 2021, 16:53

kiRRow píše:
01 bře 2021, 16:19
Piny se přece dávaj do define a s řádným komentářem.
"Se přece" není jediná správná praxe. Je to jedna z těch lepších.
Define nedisponuje typovou kontrolou.
Já dávám piny do const byte.
kiRRow píše:
01 bře 2021, 16:19
tak si je zapíšu do define a datové pole si stvořím až po tom a právě z těch define.
Přidanou hodnotu v tom nevidím. Uvažujme třídu "TriLed", která v konstruktoru očekává definici RGB diody.
Pak je dost pohodlné mít piny v poli:

Kód: Vybrat vše

const byte PINY_R[] = {1, 4, 7}; // tady prece muze byt radny komentar
const byte PINY_G[] = {2, 5, 8}; // a tady take
const byte PINY_B[] = {3, 6, 9}; // i tady :)

TriLed** stack = new TriLed*[3]; 

for(i = 0; i <= 2; i++) {
    stack[i] = new TriLed(PINY_R[i], PINY_G[i], PINY_B[i]);
}

ohruska
Příspěvky: 224
Registrován: 08 pro 2017, 20:56
Reputation: 0

Re: Třída

Příspěvek od ohruska » 03 bře 2021, 13:37

Jen pro ukázku proč jsem chtěl použít třídu.
Protože mám 16 kusů serv, která by se měly pohybovat synchronně, tak bylo nutno vytvořit 16 objektů třídy.
Takto:

Kód: Vybrat vše

Sweeper sweeper1(15);
Sweeper sweeper2(15);
Sweeper sweeper3(15);
Sweeper sweeper4(15);
Sweeper sweeper5(15);
Sweeper sweeper6(15);
Sweeper sweeper7(15);
Sweeper sweeper8(15);
Sweeper sweeper9(15);
Sweeper sweeper10(15);
Sweeper sweeper11(15);
Sweeper sweeper12(15);
Sweeper sweeper13(15);
Sweeper sweeper14(15);
Sweeper sweeper15(15);
Sweeper sweeper16(15);
Pokud, ale vytvořím pole 16-cti objektů třídy, tak to lze takto:

Kód: Vybrat vše

Sweeper sw[16];
Pokud potřebuji třeba definovat číslo serva, tak je to takto:

Kód: Vybrat vše

sweeper1.Attach(0);
sweeper2.Attach(1;
sweeper3.Attach(2);
sweeper4.Attach(3);
sweeper5.Attach(4);
sweeper6.Attach(5);
sweeper7.Attach(6);
sweeper8.Attach(7);
sweeper9.Attach(8);
sweeper10.Attach(9);
sweeper11.Attach(10);
sweeper12.Attach(11);
sweeper13.Attach(12);
sweeper14.Attach(13);
sweeper15.Attach(14);
sweeper16.Attach(15);
Pokud to udělám pomocí pole objektů je to takto:

Kód: Vybrat vše

for( int i=0; i<=15; i++ )
{
sw[i].Attach(i); 
}

Odpovědět

Kdo je online

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