<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/>