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.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
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.