ceckovy kviz 2 (hardcore)
Pavel Hudeček
edizon na seznam.cz
Čtvrtek Září 7 13:27:55 CEST 2023
Takhle bych to dělal v v Basicu na Spectru v roce 1988:-)
Tohle je podle mě typická úloha na for. Samozřejmě to předpokládá, že
adr se nějak sdruží,aby je for mohl pohodlně adresovat. No a v tom foru
je pak jen jeden if a v něm nastavení výstupní hodnoty a pak break.
Takže něco jako:
#define ZNAK_nestisk 'n'
char znaky="5401#37*2698n";
char adr;
for (adr=0; adr<12; adr++) {
setAdrKlav(adr);
if(!Outkl) break;
}
Znak1=znaky[adr];
A pak teda ještě další for okolo, který pošle přečtenou hodnotu dál, až
když je po dobu třeba 0,1 sekundy trvale stejná.
Ale třeba já tohle přímý čekání a čtení používám jen tak když je
jedno/dvě tlačítka. Jinak to mám někde v čekací funkci, která čeká
zadaný počet ms a je součástí jakéhokoli čekání. V ní je část, kde je
jednou za ms, nebo po jednom cyklu čtení a průměrování ADC, nějaký
takový for, který stanoví stisklou klávesu, potom zjištění, kolikrát po
sobě už to tak je, ...
PH
Dne 07.09.2023 v 12:32 Vláďa Anděl napsal(a):
> Tohle rád čtu. Sice nejsem programátor, céčko jsem se učil podle
> učebnice Herouta a dál jsem nikdy nepokročil, ale přesně takhle goto
> používám při čtení znaků z 16 znakové klávesnice. Přijde mi to
> přehledné a jednoduché.
>
> Adr1=0; Adr2=0; Adr3=0;
> Adr0=0; Zpozkl(); if(!Outkl) { Znak1='*'; goto Stisk; }
> Adr0=1; Zpozkl(); if(!Outkl) { Znak1='7'; goto Stisk; }
> Adr1=1; Zpozkl(); if(!Outkl) { Znak1='1'; goto Stisk; }
> Adr0=0; Zpozkl(); if(!Outkl) { Znak1='4'; goto Stisk; }
> Adr2=1; Zpozkl(); if(!Outkl) { Znak1='9'; goto Stisk; }
> Adr1=0; Zpozkl(); if(!Outkl) { Znak1='8'; goto Stisk; }
> Adr0=1; Zpozkl(); if(!Outkl) { Znak1='2'; goto Stisk; }
> Adr1=1; Zpozkl(); if(!Outkl) { Znak1='3'; goto Stisk; }
> Adr3=1; Adr2=0; Zpozkl(); if(!Outkl) { Znak1='0'; goto Stisk; }
> Adr0=0; Zpozkl(); if(!Outkl) { Znak1='5'; goto Stisk; }
> Adr1=0; Zpozkl(); if(!Outkl) { Znak1='6'; goto Stisk; }
> Adr0=1; Zpozkl(); if(!Outkl) { Znak1='#'; goto Stisk; }
>
> if(Caskl) Caskl--; // nestisknuta klavesnice
> Opakkl=0;
> return;
>
> Stisk: //ochrana proti dvojimu stisknuti
>
> Anděl
>
> Dne 07.09.2023 v 2:07 Miroslav Šinko napsal(a):
>> On 6.9.2023 18:33, Jan Waclawek wrote:
>>> Na druhej strane to goto je skutocne svinstvo
>>
>> S tymto zas uplne nesuhlasim. Je to svinstvo, ked sa pouziva v
>> algoritmoch, to absolutne nepouzivam. Ale na osetrovanie podmienok a
>> skok vylucne na "upratovaci" koniec funkcie je vyhodne ho pouzit. To
>> aj robime a dokonca to doporucujeme novym kolegom. Vedie to k
>> eliminacii chyb (memory leakov) a jednoduchsiemu kodu. Pisem o cistom
>> C, nie C++, kde su moznosti ine.
>>
>> Majme (s cim sa stretavame vo vacsine nasich kodov) funkciu na prijem
>> dat, ktora musi zistit stav spracovania, ak ok, zistit velkost
>> prijatych dat, ak ok, alokovat data buffer, ak ok, vycitat data do
>> buffra, ak ok, zavolat parsovaciu funkciu, ktora vytvori (alokuje)
>> prehladavaciu tabulku, ak ok, vyhladat record, ak ok, pripadne
>> alokovat buffer na response data k danemu recordu, ak ok, to iste s
>> dalsim recordom, a s dalsim, a s dalsim, atd...
>>
>> Mozme urobit sekvenciu ifov a elsov, pekne poodsadzovanu az za pravy
>> okraj monitora. V kazdom jednom else uvolnit buffre, ktore boli
>> dovtedy alokovane, t.j. co dalsie else, to kopia predosleho kodu +
>> riadok navyse.
>> Alebo mozme urobit sadu funkcii, do ktorych budeme predavat vzdy o
>> jeden parameter viac. Alebo mat jednu free funkciu, kde predame
>> vsetky pointery na buffre, ta bude volana X-krat a odsadzovanie az za
>> okraj monitora aj tak ostane.
>>
>> No, alebo mozme pisat len ify na negativny vysledok, v nom jeden
>> riadok log(..prislusny error..) a druhy riadok goto _end;
>>
>> A pred koncom funkcie mat navestie _end:, za ktorym je spolocny kod,
>> ktory sa vykona, aj ked vsetko zbehlo spravne, v zmysle:
>> if(data != NULL)
>> {
>> free(data);
>> }
>> if(searchTable != NULL)
>> {
>> free(searchTable);
>> }
>> if(recordX != NULL)
>> {
>> free(recordX);
>> }
>> atd..
>>
>> Vsetky pointery na alokovane buffre su samozrejme na zaciatku
>> inicializovane na NULL. To je dalsi best practice, mat vsetky
>> premenne inicializovane.
>>
>> miro
>> _______________________________________________
>> 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
Další informace o konferenci Hw-list