Re: funkce v C - pro to nechod
Jaroslav Buchta
jaroslav.buchta na hascomp.cz
Středa Prosinec 30 11:16:02 CET 2015
Funguje to IMHO proto, že konstanta 65536 bude jako typ long a tim padem
se cely vyraz pocita v long. Korektne by to IMHO bylo takto:
return (((unsigned long)EEPROM.read (alarmclock + 2) * 65536UL) +
((unsigned long)EEPROM.read (alarmclock + 1)) * 256UL +
((unsigned long)EEPROM.read (alarmclock)));
Dne 30.12.2015 v 9:08 Petr Zapadlo napsal(a):
> Zdravím,
>
> díky za vysvětlení, to vypadá hodně pravděpodobně. ano, návrat z
> eeprom je typ byte.
> Výsledek má být long, jak to napsat aby už ten součin proběhl jako long?
>
> A v tom druhém případě:
> unsigned int alarm2 = EEPROM.read (alarmclock + 2);
> unsigned int alarm1 = EEPROM.read (alarmclock + 1);
> unsigned int alarm0 = EEPROM.read (alarmclock);
> alarm=alarm2*65536+alarm1*256+alarm0;
>
> proč to probíhá dobře? je to dáno tím, že jsem označil int jako
> neznaménkový a proto nepřetéká? a nebo že v tom řádku už se ty součiny
> řeší jako long? (alarm je long)
>
> Díky
>
> Petr
>
>
>
>
> PS Disasemblat už asi nedodám - omylem jsem si smazal zdrojový kod co
> jsem včera celý den psal. Lze to nějak zpětně zrekonstruovat z arduina?
>
>
> Dne 30.12.2015 v 00:26 Jan Waclawek napsal(a):
>> Zacnem s tym, ze to je C++ a nie C.
>>
>> C++ presne nepoznam, ale je mozne, ze to spravanie v tomto konkretnom
>> pripade je rovnake ako v C. Zakladom "problemu" je vsak urcite fakt,
>> ze int je v avr-gcc aj avr-g++ 16-bitovy. Neviem sice, aky je
>> navratovy typ funkcie (pardon, ++ metody) co cita z EEPROM, ale
>> tipujem, ze to bude jeden z troch 8-bitovych typov, co sa pred
>> nasobenim vdaka usual arithmetic conversions konvertuje na int.
>> Rovnako konstanta 256 zo stredneho sucinu je implicitne int, ergo aj
>> ten sucin je typu int. Konstantny vysledok pri inkriminovanej hodnote
>> "stredneho parametra" nad 250 (a pravdepodobne nad 128) je asi dana
>> optimalizaciou vychadzajucou z faktu, ze 128 a viac * 256 do
>> [znamienkoveho 16-bitoveho] int pretecie, a teda vysledok sucinu je
>> nedefinovany, ergo moze byt aj nahodne cislo alebo aj konstanta.
>>
>> Bolo by poucne vidiet relevantny disasemblat.
>>
>> wek
>>
>>
>> _______________________________________________
>> HW-list mailing list - sponsored by www.HW.cz
>> Hw-list na list.hw.cz
>> http://list.hw.cz/mailman/listinfo/hw-list
>
> _______________________________________________
> HW-list mailing list - sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list
Další informace o konferenci Hw-list