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