Re: Ukazka C++ pro děti
ajtservis
info na ajtservis.cz
Středa Březen 31 15:51:31 CEST 2021
tady je ten problem, ze za vsim vidim fyzicky kremik. tedy treba tu x51,
kde je jasne dane, ze nic nez pamet, nebo nekolik typu pameti, v tom
mikroradici neni :-). takze pokud vsechno je stejne jen misto v pameti,
at pevne umistene a presne dlouhe nebo jen promena na chvili, tak proc
to obalovat do tech "kouzel" ? to dela ten kompilator, vim, je to
jednodussi, ale je to porad jen pamet a je to misto kde se da narazit.
pamet by me treba nezajimala u matematickych operaci. tam bych to
ulehceni ceckem bral, nez to resit po registrech a xx radcich pro kazdou
pidi operaci. stacilo by mi vedet, ze xx registru/pameti je rezervovano
pro matematiku nebo mam smulu.
no, uvidim jestli se to nejak poda :-)
diky vsem.
t.
Dne 31.03.2021 v 14:38 Pavel Brychta napsal(a):
> Dobře, takže ještě jinak:
>
> V C vytvoříte globální proměnnou třeba:
>
> int var;
>
> při překladu pro ni překladač vytvoří místo v paměti a všechny odkazy v
> programu namíří na tohle místo. Teď si ale představte, že nemáte jen
> jednoduchou proměnnou, která zabírá paměť, ale chcete mít něco, co dělá
> něco navíc - například si zapamatuje, kdy jste naposledy do té proměnné
> něco psal. Nejde tedy o proměnnou, ale programový objekt, který má
> nějaké vlastnosti - pojmenujme ten objekt (jeho třídu) timeStampInt.
> Pokud takový objekt chcete používat, tak nestačí pro něj jen vyhradit
> místo v paměti, ale je třeba také naplnit dodatečné parametry - v tomto
> hypotetickém případě třeba nastavit časový okamžik posledního přístupu
> jako -1 = nikdy nepřistoupeno. Tohle je právě úkol pro konstruktor
> objektu, což z hlediska programování je jen procedura (abych se
> přiblížil terminologii Pascalu), která zajistí to počáteční nastavení
> časové značky a je volaná při vytváření objektu (vyhrazování paměťového
> prostoru pro jeho data). Pokud tento objekt chcete vytvořit globálně,
> syntaxe je jasná:
>
> timeStampInt var;
>
> potud je to správně, ale - protože víme, že při vytváření objektu je
> nutné volat jeho konstruktor - je třeba si zde uvědomit, že to za nás
> někdo musí udělat. Proto kompilátor při překladu sestavuje seznam takto
> vytvořených objektů, který je použitý ve startup kódu pro volání
> odpovídajících konstruktorů ještě předtím, než je řízení předáno Vašemu
> programu, který píšete (main). Tím je zajištěné to, že takto vytvořené
> objekty jsou inicializované a můžete je kdykoliv okamžitě začít používat.
>
> Pavel Brychta
>
> Dne 31. 03. 21 v 14:19 ajtservis napsal(a):
>> asi to mam nejak jinak. zadna tahle slova nepouzivam.
>> znam jen typy promenych, pak funkce a procedury a ostatni si naklikam
>> na plochu v graficky podobe :-)
>> vrchol je mit zvlast data soubor pro ty nektere funkce a procedury a u
>> exace soubor ini pro zapis a cteni ruznych parametru a vygenerovat
>> html soubor jako protokol testu.
>> tohle dohromady klidne 20k radek programu a facha to(delphi 7).
>> asi tam ty tridy, objety atd. nekde budou, ale zatim jsem je zkoumat
>> nepotreboval. srovnani vysledku sw, jeho funkce, pouzitelnosti a
>> velikosti proti novym mladym objektovym programatorum, treba v c#, u
>> nas ve firme, bylo vzdy plus pro me, tak fakt nevim :-)
>> jedinej "destruktor" jsem pak asi ja.
>> t.
>>
>>
>> Dne 31.03.2021 v 13:53 Pavel Brychta napsal(a):
>>> :D tak schválně zkusím tu větu zkrátit a věc popsat jinak:
>>>
>>> I v Delphi/Pascalu si jistě pamatujete na Constructor Init a
>>> Destructor Done - při práci s objektem je ho potřeba nejdřív
>>> "vytvořit" a pak taky občas "zrušit" - k tomuto účelu právě slouží
>>> konstruktory a destruktory. Konstruktor je volaný ve chvíli, kdy se
>>> objekt vytváří - v tomto případě, vzhledem k tomu, že objekt je
>>> vytvořený staticky a globálně se konstruktor volá ve chvíli, kdy
>>> probíhá inicializace všech statických/globálních objektů, tedy někde
>>> ve startup kódu daného mikrokontroléru. Pořadí volání konstruktorů
>>> určuje kompilátor, co se dělo předtím a co se bude dít potom určuje
>>> struktura startup kódu. Nedokážu tedy říct v jakém stavu se zařízení
>>> nachází - lidštěji co už nastavené je, co není a teprve se nastavovat
>>> bude. V této situaci začnu nastavovat přerušovací systém a namířím ho
>>> do jiné části kódu, která pracuje s proměnnými mimo aktuálně
>>> inicializovaný objekt (v jakém jsou stavu bůh suď).
>>>
>>> No, nějak mi to nevyšlo na kratší popis, ale velmi rád se podívám,
>>> jak to popsat snadněji ;-)
>>>
>>> Pavel Brychta
>>>
>>> Dne 31. 03. 21 v 13:37 ajtservis napsal(a):
>>>> hezky den.
>>>> sleduji tohle vlakno jako uplny "nececkar". zkusennost jen asm51 a
>>>> delphi, ale neobjekovym zpusobem, bych rekl :-)
>>>> prvni vec co me prepadla je jak uz bylo uvedeno "Bohajeho, tohle že
>>>> je pro děti?".
>>>> pak prispevek jak postupovat pomaleji, ten ok.
>>>> a nakonec to zabije veta, v dalsim prispevku "Například aktivace
>>>> přerušovacího systému ve staticky volaném konstruktoru, kde je cíl
>>>> volání mimo třídu je snad jasná hovadina pro jakýkoliv názor..." :-)
>>>> mam asi zasadni problem si pod slovy trida, metoda, objekt,
>>>> konstruktor atd. predstavit o co v tom programovani vlastne jde ?
>>>> mam prakticky fumkcni projekty v asm nebo i deplhi/pascalu, ale
>>>> vubec si je nedokazu v predstavach spojit s timto nazvoslovim, co
>>>> cemu asi odpovida.
>>>> nekolik zacatku s lepsima ceckama a objektama, nekolik knizek,
>>>> navodu a nic. proste se mi pri tech nazvech zablokuje mysleni a
>>>> konec :-)
>>>> neni nejaka tabulka ekvivalent tech hruzonazvu, aby clovek treba
>>>> nejak konvertoval ?
>>>> je ale videt , ze nekteri si v skladani dlouuuuhych vet z techto
>>>> nazvu/zaklinadel libuji.
>>>> asi mam nejakou poruchu mysleni a ne ji porad prekonat :-)
>>>> te vyhuky pro deti, bych se asi i rad ucastnil, je to nekde dostupne
>>>> jako stranky ?
>>>> tomik.
>>>> ps. treba bych byl dobry experimetalni objekt, jak udelat z hornika
>>>> programatora :-)
>>>>
>>>>
>>>> Dne 31.03.2021 v 11:51 Jiří Nesvacil napsal(a):
>>>>> Dobrý den,
>>>>>
>>>>> jdete správnou cestou, ale ještě bych to zjednodušil. Před čase
>>>>> jsem se ptal, zda nechte někdo nějaký on-line kroužek, ale ozval se
>>>>> jen jeden, zda to děkuji, ale to je málo. Zatím jsme tedy sami
>>>>> postoupili, ale dělám to jinak a mám následující fáce.
>>>>>
>>>>> a/ otevřít notepad a naučit aspoň napsat pár písmenek.
>>>>> b/ naučit se s myší a okopírovat kousek textu.
>>>>> c/ připravit kus kód, kde není nic v cizím jazyku, nejsou zde věci,
>>>>> které se naučili nedávno. Začnu jen s tím, aby se přahazoval řádek
>>>>> v kódu. Něco jako jazyk "Karel" graficky. Jen přehodit pořadí, aby
>>>>> se pochopila posloupnost.
>>>>> d/ další příklad volání metody s hodnotou třeba psun(5);
>>>>> e/... proměnné, cykly,... zase tímto jednoduchým stylem.
>>>>>
>>>>> ... objekty taky jednoduše. Neboli osobně bych vyházel všechny
>>>>> define, založil to na malé třídě. Začít třeba se základem proměnné
>>>>> v objektu tzv. instanční. Až následně do složitějších konstrukcí,
>>>>> ale opět i složité konstrukce na jednoduchém příkladu tj. bez
>>>>> ostatních věcí co se mohlo zapomenout.... . Je to o tom to dělat
>>>>> pomalu. Možná máte větší děti nebo toho znají více... .
>>>>>
>>>>> Jirka
>>>>>
>>>>>
>>>>> Dne 30.03.2021 v 20:08 Pavel Hudecek napsal(a):
>>>>>>
>>>>>> Dobrý den všem,
>>>>>>
>>>>>> Udělal jsem malou ukázku programu v C++ pro děti na kroužek,
>>>>>> prosím o zhodnocení, zda v tom nejsou nějaký nevhodný věci:-)
>>>>>>
>>>>>> (celé je to pro Xnano416 mající 1 LED a 1 tlačítko)
>>>>>>
>>>>>> Otázka je, jak se to zmrší posláním v mailu…
>>>>>>
>>>>>> #include <avr/io.h>
>>>>>>
>>>>>> #include <avr/interrupt.h>
>>>>>>
>>>>>> #define F_CPU (20000000UL/6UL)
>>>>>>
>>>>>> #define LED_bit 5 // LEDka
>>>>>>
>>>>>> #define TL_bit 4 // tlačítko
>>>>>>
>>>>>> #define TEST_bit 3 // test přerušení osciloskopem
>>>>>>
>>>>>> #define TEST_bit2 2 // test čekání osciloskopem
>>>>>>
>>>>>> #define TL_jeStisk ((PORTB.IN & (1<<TL_bit)) == 0)
>>>>>>
>>>>>> volatile unsigned int ms=0;
>>>>>>
>>>>>> volatile unsigned char msSync=0;
>>>>>>
>>>>>> void cekej(unsigned int n); // prototyp funkce - jen aby za ním
>>>>>> bylo vidět jak funkce vypadá
>>>>>>
>>>>>> class clTlac { //
>>>>>> +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>>>>>>
>>>>>> public:
>>>>>>
>>>>>> clTlac() { // konstruktor - spusti se pri
>>>>>> vytvoreni objektu ----------------------------
>>>>>>
>>>>>> PORTB.PIN4CTRL = PORT_PULLUPEN_bm;
>>>>>>
>>>>>> // zapnout pull-up pro tlačítko
>>>>>>
>>>>>> }
>>>>>>
>>>>>> void cek() { // cekani na stisk
>>>>>> --------------------------------------------------------
>>>>>>
>>>>>> while(TL_jeStisk) cekej(0);
>>>>>>
>>>>>> while(!TL_jeStisk) cekej(0);
>>>>>>
>>>>>> }
>>>>>>
>>>>>> void stisk(); // udalost stisku tlacitka - jen
>>>>>> deklarace
>>>>>>
>>>>>> bool stav=false;
>>>>>>
>>>>>> };
>>>>>>
>>>>>> class clLED { //
>>>>>> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>>>>>>
>>>>>> friend void cekej(unsigned int n);
>>>>>>
>>>>>> // friend smí i do private
>>>>>>
>>>>>> public:
>>>>>>
>>>>>> const unsigned int PMAX = F_CPU / 1000UL;
>>>>>>
>>>>>> const unsigned int P1 = PMAX / 100;
>>>>>>
>>>>>> clLED() { // konstruktor - spusti se pri vytvoreni
>>>>>> objektu -----------------------------
>>>>>>
>>>>>> PORTB.OUTSET = 1<<LED_bit; //
>>>>>> nastavit na 1, aby LEDka nesvítila od začátku
>>>>>>
>>>>>> PORTB.DIR = (1<<LED_bit) |
>>>>>> (1<<TEST_bit) | (1<<TEST_bit2) ; // zapnout výstupy pro LED
>>>>>>
>>>>>> PORTB.PIN5CTRL = PORT_INVEN_bm; // Invertovat, aby LED svitila pri
>>>>>> 1 (1 v datech)
>>>>>>
>>>>>> PORTMUX_CTRLC = PORTMUX_TCA02_ALTERNATE_gc;
>>>>>>
>>>>>> TCA0_SINGLE_CTRLA = TCA_SINGLE_CLKSEL_DIV1_gc;
>>>>>>
>>>>>> TCA0_SINGLE_CTRLB = TCA_SINGLE_CMP2EN_bm |
>>>>>> TCA_SINGLE_WGMODE_SINGLESLOPE_gc;
>>>>>>
>>>>>> TCA0_SINGLE_CTRLC = 0;
>>>>>>
>>>>>> TCA0_SINGLE_CTRLD = 0;
>>>>>>
>>>>>> TCA0_SINGLE_PER = F_CPU / 1000UL;
>>>>>>
>>>>>> TCA0_SINGLE_INTCTRL = TCA_SINGLE_OVF_bm;
>>>>>>
>>>>>> TCA0_SINGLE_INTFLAGS = TCA_SINGLE_OVF_bm;
>>>>>>
>>>>>> TCA0_SINGLE_CMP2 = P1;
>>>>>>
>>>>>> TCA0_SINGLE_CTRLA |= TCA_SINGLE_ENABLE_bm;
>>>>>>
>>>>>> __asm__("sei");
>>>>>>
>>>>>> }
>>>>>>
>>>>>> void svitit(uint8_t proc) { // rozsvitit na zadane
>>>>>> % -----------------------------------
>>>>>>
>>>>>> TCA0_SINGLE_CMP2 = P1 * proc;
>>>>>>
>>>>>> tim = 0;
>>>>>>
>>>>>> }
>>>>>>
>>>>>> void blikat(unsigned int t, unsigned char h,
>>>>>> unsigned char l) { // ---------------------
>>>>>>
>>>>>> tim = t;
>>>>>>
>>>>>> cnt = 0;
>>>>>>
>>>>>> pwmH = P1 * h;
>>>>>>
>>>>>> pwmL = P1 * l;
>>>>>>
>>>>>> TCA0_SINGLE_CMP2 = pwmH;
>>>>>>
>>>>>> }
>>>>>>
>>>>>> unsigned int procToPWM(unsigned char n) { //
>>>>>> prevod procent na PWM ---------------------
>>>>>>
>>>>>> return P1 * n;
>>>>>>
>>>>>> }
>>>>>>
>>>>>> private:
>>>>>>
>>>>>> unsigned int pwmL = 0, pwmH = PMAX, tim = 0, cnt
>>>>>> = 0;
>>>>>>
>>>>>> void togglePwm() { // prehodit PWM z low na hi /
>>>>>> naopak --------------------------------
>>>>>>
>>>>>> if (TCA0_SINGLE_CMP2 == pwmH)
>>>>>>
>>>>>> TCA0_SINGLE_CMP2 = pwmL;
>>>>>>
>>>>>> else
>>>>>>
>>>>>> TCA0_SINGLE_CMP2 = pwmH;
>>>>>>
>>>>>> }
>>>>>>
>>>>>> };
>>>>>>
>>>>>> // Tady se podle tříd clTlac a clLED vytvoří objekty Tlacitko a
>>>>>> Led. To spustí jejich konstruktory.
>>>>>>
>>>>>> clTlac Tlacitko;
>>>>>>
>>>>>> clLED Led;
>>>>>>
>>>>>> void cekej(unsigned int n) { //
>>>>>> ==============================================
>>>>>>
>>>>>> static bool tlacStickPred=false;
>>>>>>
>>>>>> __asm__("cli");
>>>>>>
>>>>>> ms=0;
>>>>>>
>>>>>> __asm__("sei");
>>>>>>
>>>>>> while(1) {
>>>>>>
>>>>>> PORTB.OUTTGL = (1<<TEST_bit2);
>>>>>>
>>>>>> if (msSync==1) { //
>>>>>> ----------------------------------------
>>>>>>
>>>>>> msSync=0;
>>>>>>
>>>>>> Tlacitko.stav = TL_jeStisk;
>>>>>>
>>>>>> if (Led.tim>0) { // je zapnute blikani
>>>>>>
>>>>>> if (++Led.cnt>Led.tim) {
>>>>>>
>>>>>> Led.cnt=0;
>>>>>>
>>>>>> Led.togglePwm();
>>>>>>
>>>>>> }
>>>>>>
>>>>>> }
>>>>>>
>>>>>> } // if (msSync==1)
>>>>>>
>>>>>> if (!tlacStickPred &&
>>>>>> Tlacitko.stav) { // právě bylo stisknuto, vyvolat událost
>>>>>>
>>>>>> Tlacitko.stisk();
>>>>>>
>>>>>> }
>>>>>>
>>>>>> tlacStickPred=Tlacitko.stav;
>>>>>>
>>>>>> __asm__("cli");
>>>>>>
>>>>>> if (ms>=n) break;
>>>>>>
>>>>>> __asm__("sei");
>>>>>>
>>>>>> } // while(1)
>>>>>>
>>>>>> __asm__("sei");
>>>>>>
>>>>>> }
>>>>>>
>>>>>> // implementace obsluhy události stisk tlačítka
>>>>>>
>>>>>> void clTlac::stisk() { //
>>>>>> ===================================================
>>>>>>
>>>>>> static bool b=false;
>>>>>>
>>>>>> // zatímco v mainu se čekat musí, tady se naopak
>>>>>> nesmí
>>>>>>
>>>>>> if (b) {
>>>>>>
>>>>>> Led.blikat(200, 100, 0);
>>>>>>
>>>>>> } else {
>>>>>>
>>>>>> Led.blikat(200, 60, 30);
>>>>>>
>>>>>> }
>>>>>>
>>>>>> b = !b;
>>>>>>
>>>>>> }
>>>>>>
>>>>>> int main(void) { //
>>>>>> ###########################################################
>>>>>>
>>>>>> // tady nic neni: inicializace je v konstruktorech
>>>>>>
>>>>>> Led.blikat(100, 70, 20);
>>>>>>
>>>>>> while (1) { //
>>>>>> ---------------------------------------------------
>>>>>>
>>>>>> // je jedno co tu je, hlavně že to
>>>>>> obsahuje čekání
>>>>>>
>>>>>> cekej(100);
>>>>>>
>>>>>> Tlacitko.cek();
>>>>>>
>>>>>> }
>>>>>>
>>>>>> }
>>>>>>
>>>>>> ISR (TCA0_OVF_vect) { //
>>>>>> =====================================================
>>>>>>
>>>>>> PORTB.OUTTGL = (1<<TEST_bit);
>>>>>>
>>>>>> ms++;
>>>>>>
>>>>>> msSync=1;
>>>>>>
>>>>>> TCA0_SINGLE_INTFLAGS = TCA_SINGLE_OVF_bm;
>>>>>>
>>>>>> }
>>>>>>
>>>>>> Díky,
>>>>>>
>>>>>> PH
>>>>>>
>>>>>>
>>>>>> _______________________________________________
>>>>>> HW-list mailing list - sponsored bywww.HW.cz
>>>>>> Hw-list na list.hw.cz
>>>>>> http://list.hw.cz/mailman/listinfo/hw-list
>>>>>
>>>>>
>>>>> ------------------------------------------------------------------------
>>>>>
>>>>> Logo AVG <http://www.avg.com/internet-security>
>>>>>
>>>>> Tento e-mail byl zkontrolován na viry antivirovým softwarem AVG.
>>>>> www.avg.cz <http://www.avg.com/internet-security>
>>>>>
>>>>>
>>>>> <#DAB4FAD8-2DD7-40BB-A1B8-4E2AA1F9FDF2>
>>>>>
>>>>> _______________________________________________
>>>>> HW-list mailing list - sponsored by www.HW.cz
>>>>> Hw-list na list.hw.cz
>>>>> http://list.hw.cz/mailman/listinfo/hw-list
>>>>>
>>>>
>>> _______________________________________________
>>> HW-list mailing list - sponsored by www.HW.cz
>>> Hw-list na list.hw.cz
>>> http://list.hw.cz/mailman/listinfo/hw-list
>>
> _______________________________________________
> HW-list mailing list - sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list
--
AJT SERVIS s.r.o.
Oparno 65
Velemín
ICO:04203879
DIC:CZ04203879
email:
info na ajtservis.cz
tel.
777 584 558
Další informace o konferenci Hw-list