Diskuze: Anonymní statické pole ve statickém poli
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.
Zobrazeno 7 zpráv z 7.
K personalizaci obsahu a reklam, poskytování funkcí sociálních médií a analýze naší návštěvnosti využíváme soubory cookie. Informace o tom, jak náš web používáte, sdílíme se svými partnery pro sociální média, inzerci a analýzy. Partneři tyto údaje mohou zkombinovat s dalšími informacemi, které jste jim poskytli nebo které získali v důsledku toho, že používáte jejich služby.
Používáme nezbytné cookies pro fungování webu a s tvým souhlasem také analytické a marketingové cookies.
Zajišťují základní funkce, bezpečnost a služby, které sis vyžádal. Nelze je vypnout.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| ITnetwork | ITnetwork | Provoz webu, relace, přihlášení a uložení nastavení cookies. | PHPSESSID, auth_token, sid, itn_consent_impression, __Host-itn_consent | Relace až 1 rok |
| Google Tag Manager | Správa značek a načítání měřicích nástrojů webu. | Žádné | Neukládá se | |
| Google Fonts | Načítání typografie webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google Hosted Libraries | Načítání potřebných knihoven a stylů webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google reCAPTCHA | Ochrana formulářů a webu před zneužitím. | _GRECAPTCHA, rc::a, rc::b, rc::c, rc::f | Relace až 180 dní | |
| YouTube | Přehrávání vloženého video obsahu. | localStorage, IndexedDB; cookies after playback interaction | Relace až trvalé úložiště | |
| Vimeo | Vimeo | Přehrávání vloženého video obsahu. | __cf_bm, _cfuvid, vuid, localStorage, IndexedDB | Relace až 2 roky |
| Facebook Login | Meta | Přihlášení pomocí účtu třetí strany. | Úložiště řízené poskytovatelem | Relace až 1 rok |
| GoPay | GoPay | Zpracování uživatelem vyžádané platby. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
Pomáhají nám porozumět používání webu a zlepšovat ho.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Analytics 4 | Měření návštěvnosti a používání webu. | _ga, _ga_* | Až 2 roky | |
| Microsoft Clarity | Microsoft | Měření návštěvnosti a používání webu. | _clck, _clsk, _cltk | Relace až 1 rok |
Slouží k měření kampaní, personalizaci reklamy a marketingové komunikaci.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Ads | Měření kampaní, reklama a remarketing. | _gcl_au, _gcl_ls | Relace až 90 dní | |
| Meta Pixel | Meta | Měření kampaní, reklama a remarketing. | _fbp, _fbc, localStorage | Až 90 dní |
| Sklik | Seznam.cz | Měření kampaní, reklama a remarketing. | retargeting, sid, szn:* | Relace až trvalé úložiště |
| LinkedIn Insight | Měření kampaní, reklama a remarketing. | bcookie, li_gc, lidc, __cf_bm | Relace až 1 rok | |
| Ecomail | Ecomail.cz | Měření kampaní, reklama a remarketing. | ecmid, Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
| Atribuce kampaní ITnetwork | ITnetwork | Přiřazení návštěvy a objednávky ke kampani. | campaign_clid[*], user_session_context | Až 1 rok |
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.


Aha, mám to 
static void **config_values2[] = {
[CONFIG_TYPE_BOOL] = (void* [sizeof(uint8_t) * (CONFIG_PARAMETER_COUNT_BOOL) ]) {},
[CONFIG_TYPE_INT] = (void* [sizeof(int) * (CONFIG_PARAMETER_COUNT_INT) ]) {},
[CONFIG_TYPE_FLOAT] = (void* [sizeof(float) * (CONFIG_PARAMETER_COUNT_FLOAT) ]) {},
[CONFIG_TYPE_STRING] = (void* [sizeof(char *) * (CONFIG_PARAMETER_COUNT_STRING)]) {}
};
A jo, struktura, dobrej point.
Myslím že jsem o struktuře taky přemíšlel, ale nejhorší bylo
vymyslet, jak pojmenovat jednotlivé členy. Nemůžu je pojmenovat "bool",
"int", "float", to jsou zakázaný slova
Možná "type_bool", "type_int"
atd.. ale to už začíná být dlouhý.
A další věc byla, že jsem chtěl na základě identifikátoru typu rovnou
vybrat to správné pole s hodnotami - např. "config_values[type][idx *
type_size]". Ale pak jsem zjistil, že abych s nima mohl nějak rozumně
pracovat, tak musím stejně ukazatel void* přetypovat na ukazatel správného
typu, aby to neházelo v kompilátoru varování při ukládání do jiné
proměnné. Takže tam stejně musím mít nějaký switch, a tak je nakonec
jedno jestli to budu mít ve 4 proměnných, nebo jedné struktuře se 4mi
členy 
Pojmenovat jednotlivé členy struktury už je to nejmenší (např. b_type, i_type). Srozumitelnost má větší váhu než délka identifikátoru.
Ano, void* je třeba před použitím přetypovávat na adekvátní typ. Dále pokud bys měl vše v jednom poli, musíš udržovat offsety jednotlivých částí. Vědět kde začíná sekce pro bool, kde pro int, atd. Zbytečně bys musel používat aritmetické operace pro přístup do odpovídající části pole.
a tak je nakonec jedno jestli to budu mít ve 4 proměnných, nebo jedné struktuře se 4mi členy
Není, neboť členy struktury jsou vedle sebe (pokud neberu v potaz padding). Na rozdíl od 4 samostatných polí, které mohou být v paměti rozhozeny různě. Máš tak větší šanci že si můžeš případně alokovat prostor pro větší souvislá data a alokace neselže. Ač jsou to 4 různá pole, mají k sobě určitou souvislost. Je tedy dobré je mít v rámci struktury. Deklarace struktury je o dost jednodušší. Práce s prvky struktury může být rovněž přehlednější. Struktura v tu chvíli funguje jako někdo kdo za ta pole zodpovídá.
Podle mě na to jdeš s kanónem na vrabce. Programuji mj. MCU od Microchipu a tam se pro nastavení různých parametrů konfigurace používají struktury a konfigurační masky skupiny.
Např.
ADC0.CTRLC &= ~(ADC_PRESC_gm); /* Clearing the prescaler bit field using a group mask */
Viz např. Microchip TB3262 AVR1000b: Getting Started with Writing C-Code for AVR® MCUs
DarkCoder:
Aha, to mě nenapadlo, tak struktura bude asi fakt nejlepší řešení no.
Caster:
My jsme to do teď tak nějak měli, že existovala struktura a jejími členy
byly jednotlivé parametry. Ale tam jsi pak musel explicitně specifikovat
konkrétního člena, když jsi chtěl uložit nějaký parametr nebo ho
přečíst z NVS. A když pak chceš umožnit nastavovat parametry přes Modbus
nebo webové rozhraní, tak musíš vždy vypsat všechny členy struktury,
protože v C neexistuje foreach pro strukturu. To by šlo řešit mapou se
seznamem klíčů a ukazatelem na konkrétního člena té struktury, ale to
zabere zbytečné místo paměti - kvůli ukazatelům (v případě 50
parametrů 200 bajtů, jako... není to až tak moc jak jsem myslel, než jsem
to teď spočítal
ale
stejně). Takže mi přišlo jako nejlepší udělat enumy a parametry rozházet
do několika registrů/kontejnerů podle typu, tím se zbavím nutnosti mít na
každý parametr v té mapě ukazatel.
Zobrazeno 7 zpráv z 7.