<div>Dvojita negace. Z nuly bude nula, z ostatnich hodnot jednicka.<br/>
L.<br/>
<br/>
--<br/>
Stručně naklofáno na mobilu<br/><br/>-----Original Message-----<br/>From: Fanda <hudaklan@volny.cz><br/>To: HW-news <hw-list@list.hw.cz><br/>Sent: pá, 10 úno 2017 9:45<br/>Subject: Re[2]: c-kod<br/><br/></div>Děkuji za vysvělení.
<br/>
Jestli tomu rozumím, jde v podstatě jen o to otestovat zda se mcfg vejde
<br/>
do stránky FLASH_PAGE_SIZE?
<br/>
Ještě, co znamenají ty dva vykřičníky u (!!(e)).
<br/>
<br/>
Děkuji.
<br/>
HUDA
<br/>
<br/>
<br/>
------ Původní zpráva ------
<br/>
Od: "Tomáš Hamouz" <<a href="mailto:hamouz@divesoft.cz">hamouz@divesoft.cz</a>>
<br/>
Komu: "HW-news" <<a href="mailto:hw-list@list.hw.cz">hw-list@list.hw.cz</a>>
<br/>
Odesláno: 10.2.2017 8:59:14
<br/>
Předmět: Re: c-kod
<br/>
<br/>
>To je záplata na preprocesor.
<br/>
>
<br/>
>Musíte si uvědomit, jak preprocesor funguje. Prochází text a když
<br/>
>narazí na makro, příslušným způsobem ho nahradí. To opakuje tak
<br/>
>dlouho, dokud je co nahrazovat. Přitom se nahrazuje v pořadí od
<br/>
>začátku do konce (wek by jistě dodal odkaz do normy).
<br/>
>
<br/>
>Jak bude vypadat text při preprocesingu:
<br/>
>
<br/>
>Původní text
<br/>
>
<br/>
> ct_assert(sizeof(mcfg) < CONFIG_SIZE);
<br/>
>
<br/>
>Po 1. průchodu
<br/>
>
<br/>
> enum { ASSERT_CONCAT(assert_line_, __LINE__) = 1/(!!(sizeof(mcfg) <
<br/>
>(FLASH_PAGE_SIZE * 2)
<br/>
>
<br/>
>Po 2. průchodu
<br/>
>
<br/>
> enum { ASSERT_CONCAT_(assert_line_, 25) = 1/(!!(sizeof(mcfg) <
<br/>
>(((uint16_t)0x400) * 2))) };
<br/>
>
<br/>
>Po 3. průchodu
<br/>
>
<br/>
> enum {assert_line_25 = 1/(!!(sizeof(mcfg) < (((uint16_t)0x400) *
<br/>
>2))) };
<br/>
>
<br/>
>
<br/>
>Při kompilaci se vyhodnotí poslední výraz a pokud podmínka nebude
<br/>
>splněna, překladač vám vynadá že dělíte nulou.
<br/>
>
<br/>
>
<br/>
>Pokud by ASSERT_CONCAT bylo definované jednodušeji, po 2. průchodu by
<br/>
>vznikla řádka
<br/>
>
<br/>
> enum {assert_line___LINE__ = 1/(!!(sizeof(mcfg) <
<br/>
>(((uint16_t)0x400) * 2))) };
<br/>
>
<br/>
>Což pravděpodobně nebylo záměrem.
<br/>
>
<br/>
>
<br/>
>Tomáš
<br/>
>
<br/>
>
<br/>
>
<br/>
>> Dobrý den,
<br/>
>> pro inspiraci a poučení se snažím projít program (BaseFlight)
<br/>
>> a není mi jasné, co dělá tato část.
<br/>
>
<br/>
>> #define ASSERT_CONCAT_(a, b) a##b
<br/>
>> #define ASSERT_CONCAT(a, b) ASSERT_CONCAT_(a, b)
<br/>
>> #define ct_assert(e) enum { ASSERT_CONCAT(assert_line_, __LINE__) =
<br/>
>> 1/(!!(e)) }
<br/>
>
<br/>
>> #define FLASH_PAGE_SIZE ((uint16_t)0x400)
<br/>
>> #define CONFIG_SIZE (FLASH_PAGE_SIZE * 2)
<br/>
>
<br/>
>> void initEEPROM(void)
<br/>
>> {
<br/>
>> ct_assert(sizeof(mcfg) < CONFIG_SIZE); //! make sure (at
<br/>
>> compile time) that config struct doesn't overflow allocated flash
<br/>
>>pages
<br/>
>> }
<br/>
>
<br/>
>> Jde hlavně o první 3 řádky.
<br/>
>> Díky za vysvětlení.
<br/>
>> HUDA
<br/>
>
<br/>
>> _______________________________________________
<br/>
>> HW-list mailing list - sponsored by <a href="http://www.HW.cz">www.HW.cz</a>
<br/>
>> <a href="mailto:Hw-list@list.hw.cz">Hw-list@list.hw.cz</a>
<br/>
>> <a href="http://list.hw.cz/mailman/listinfo/hw-list">http://list.hw.cz/mailman/listinfo/hw-list</a>
<br/>
>
<br/>
>
<br/>
>_______________________________________________
<br/>
>HW-list mailing list - sponsored by <a href="http://www.HW.cz">www.HW.cz</a>
<br/>
><a href="mailto:Hw-list@list.hw.cz">Hw-list@list.hw.cz</a>
<br/>
><a href="http://list.hw.cz/mailman/listinfo/hw-list">http://list.hw.cz/mailman/listinfo/hw-list</a>
<br/>
>
<br/>
<br/>
_______________________________________________
<br/>
HW-list mailing list - sponsored by <a href="http://www.HW.cz">www.HW.cz</a>
<br/>
<a href="mailto:Hw-list@list.hw.cz">Hw-list@list.hw.cz</a>
<br/>
<a href="http://list.hw.cz/mailman/listinfo/hw-list">http://list.hw.cz/mailman/listinfo/hw-list</a>
<br/>