AVR a problém s makrem

Ahoj mám prosbu. Dneska jsem narazil na zajímavej problém s makrem:

#define MSEC(value)                 ((value/5)-1)

Pokud se pokusím udělat tento zápis:

uint16_t xxx;
xxx = MSEC(10000 - 100);                          

tak se mi do proměné xxx uloží číslo 9979 nikoliv 1979 jak bych očekával. Používám kompilátor WinAVR-20100110 a nastavení optimalizací “s”. Nevíte někdo kde je zakopanej pes?

Preco by mal byt niekde zakopany. Vsetko sa sprava ako si to tam napisal

cize

#define MSEC(value)                 ((value/5)-1) 

xxx = (10000 - 100/5) - 1 = 9979

pravdepodobne si chcel definovat makro takto:

#define MSEC(value)                 (((value)/5)-1) 

pekny den :slight_smile:

Tak to jsem právě nechtěl. Makro bylo podle mě takto nadefinované správně:

#define MSEC(value)                 ((value/5)-1)

Můžeš prosím popsat proč došlo k tomu co jsem nechtěl? Dík

Já bych si tipnul že to čistě jenom vkládá obsah value tedy to 10000-100 a protože má dělení přednost před odčítáním, nejprve to provede 100/5 potom to odešte od 10000 a potom -1, tak bych to viděl i já, takže ta závorka navíc je tam potřeba.

Máš to blbě ozávorkovaný

Pokud děláš s parametrem makra nějaký výpočty, musíš dát celý parametr do závorky. Tedy správný zápis makra je tento :

#define MSEC(value) (((value)/5)-1)

Překladač do value dosadí to, co je v parametru jako řetězec - tedy nedělá žádné výpočty. Ty pak dělá až při rozvinutí makra s výsledným řetězcem.

Tvůj výsledný řetězec je tento :
((10000 - 100/5) - 1)

Při správném zápisu se dosadí :
(((10000-100)/5)-1)

Výsledky si vyhodnoť sám.

Dík za odpovědi…už tomu asi rozumim :smiley:

Prekladac nemoze NAJPRV vypocitat 1000 - 100, lebo vo všeobecnosti tam môžeš napísať aj výraz z premenných. A prekladač nemá ako vedieť ich hodnoty niekedy v budúcnosti, nevraviac, že sa môžu meniť.

Myslím, že ešte jeden zápis by mohol byť v poriadku

kód:

uint16_t xxx;
xxx = MSEC((10000 - 100));                         

ale nemám čas to skúšať. V každom prípade všetky “hodnoty” makra definuj v makre ozatvorkovane. nikdy nevieš ako v budúcnosti makro použiješ a to že by si sa moho dobre diviť :slight_smile:

Takéto chyby vo veľmi veľkom kóde sa ťažko hľadajú a pritom ozátvorkovanie “value” absolútne nič nestojí, ani čo sa rýchlosti a ani čo sa veľkosti výsledného kódu týka.