Stránka 1 z 1

Datový typ

Napsal: 07 dub 2020, 17:25
od rpoledna
Krásný den přeji,
prosím o radu, jak je možné, když zdám datový typ ... long a = 20 * 3600 , dostanu na zpět hodnotu 6464 . Co mi uniká ? 72 000 přece nemůže přetéct u hodnoty long, nebo se pletu ? Potřebuji uložit hodnotu celého dne v sekundách. Jen dodám pokud napíšu a = 72000 tak mi Serial.println vypíše 72 000. tak si říkám, že to mé Arduino neumí počítat :-). Blbost. Co dělám špatně? Prosím pomoc!!!

Re: Datový typ

Napsal: 07 dub 2020, 18:02
od ArduXPP
Mělo by to být.

long aa = 20;
long bb = 3600;
long cc;

cc = aa * bb;

Re: Datový typ

Napsal: 07 dub 2020, 18:29
od ArduXPP
Vypadá to, že arduino ide použije 32bit u long a, ale u čísel použije 16bit. Asi nějaké nastavení v arduino ide, nebo to, že ty čísla nemají definováno long ale int :)

Re: Datový typ

Napsal: 07 dub 2020, 18:50
od pavel1tu
long a = 20L * 3600L;

u celých čísel a long mi myslím pomáhá toto

Re: Datový typ

Napsal: 07 dub 2020, 18:55
od ArduXPP
Proč je tam L ?

Re: Datový typ

Napsal: 07 dub 2020, 19:00
od pavel1tu
ArduXPP píše:
07 dub 2020, 18:55
Proč je tam L ?
Aby to bral jako long,
setkal jsem se s tím u DUE, kde mi to blblo,
testovali jsme to i na kroužku na UNO funguje to.

Neumím moc anglicky, ale vycházel jsem z tohoto :

If doing math with integers, at least one of the numbers must be followed by an L, forcing it to be a long. See the Integer Constants page for details.
long speedOfLight = 186000L; // see the Integer Constants page for explanation of the 'L'

Re: Datový typ

Napsal: 07 dub 2020, 19:08
od KamilV
Jak se vyhodnotí

Kód: Vybrat vše

long a = 20 * 3600
?
1. Nejprve se uvažuje, že nějaký long = nějaký int * nějaký int
2. Int krát int je zase int
3. V závěru se int přetypuje na long (ale došlo u něj k "ořezání")

Jak se vyhodnotí

Kód: Vybrat vše

long a = 20L * 3600L
?
1. Nejprve se uvažuje, že nějaký long = číslo přetypované na long * číslo přetypované na long
2. Long krát long je zase long
3. V závěru je výsledek dle očekávání

Další možností by mohlo být např.

Kód: Vybrat vše

long a = (long) 20 * 3600

Re: Datový typ

Napsal: 07 dub 2020, 20:04
od rpoledna
Moc děkuji, už mi to jede ..já blbec dal long a = int 20 *3600 a divím se že to přeteče . Ještě jednou moc děkuji

Re: Datový typ

Napsal: 08 dub 2020, 07:12
od pavel1tu
rpoledna píše:
07 dub 2020, 20:04
Moc děkuji, už mi to jede ..já blbec dal long a = int 20 *3600 a divím se že to přeteče . Ještě jednou moc děkuji
Nejsi blbec,
příklady typu long a = 20 * 3600 jsou na mnoha webech - samozřejmě blbě.

Další co je na platformě Arduino opravdu opruz - jsou knihovny.
Musíš se držet těch originálních, jak já říkám, každý kdo má v riti díru si udělá svůj fork (upravenou kopii),
tu většinou nějak ořezal nebo upravil kvůli něčemu.
Bohužel už se většinou nepíše seznam těchto úprav, natož aby implementoval změny a opravy co časem proběhly v původní knihovně.
Nebo tam po čase provede takové změny, opět bez jakékoliv dokumentace, že ti přestanou chodit původní projekty když se ti knihovna updatuje.

Takže je dobré si k projektům schovávat i zálohy knihoven - pro jistotu.

I dost příkladů na netu je nefunkčních, někdy chyba v kodu, někdy chyba ve schematu.
Lidi prostě něco postaví na stole, zveřejní, ale tím že to dlouhodobě neprovozují, uniknou jim drobné i zásadní chyby.

A o to je to zábavnější ;)