Stránka 1 z 1

Třída

Napsal: 23 úno 2021, 12:13
od ohruska
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

Re: Třída

Napsal: 23 úno 2021, 14:18
od ondraN
Š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:

Re: Třída

Napsal: 23 úno 2021, 14:48
od ondraN
Tady je odkaz, jak s tím pracovat
https://www.codesdope.com/cpp-array-of-objects/

Re: Třída

Napsal: 23 úno 2021, 17:21
od ohruska
Díky za pomoc.
Už mě to funguje
Ota

Re: Třída

Napsal: 23 úno 2021, 18:19
od ondraN
Šikula :D

Re: Třída

Napsal: 26 úno 2021, 16:22
od kiRRow
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.

Re: Třída

Napsal: 26 úno 2021, 18:29
od KamilV
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 ;)

Re: Třída

Napsal: 01 bře 2021, 16:19
od kiRRow
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.

Re: Třída

Napsal: 01 bře 2021, 16:53
od KamilV
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]);
}

Re: Třída

Napsal: 03 bře 2021, 13:37
od ohruska
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); 
}