Kun otan näytteitä A0: sta 0-5V-signaalilla arduino-mikrossa alla olevan koodin kanssa, saan jonkin verran negatiiviset arvot.
int sensor = 0; sensor = abs(analogRead(A0) - 512);
Arvot:
77 25 -74 -58 46 113 -74 102 -91 -51 -126 47 31
Suoritettaessa (ilmeisesti) matemaattisesti vastaavan koodin alla saan vain positiiviset arvot.
int sensor = 0; sensor = analogRead(A0); sensor = sensor - 512; sensor = abs(sensor);
En usko, että tämä on kokonaisluvun ylivuoto kuten tässä viestissä , koska kun vaihdan tilaan long sensor = 0
, saan samat negatiiviset tulokset.
Mitä täällä tapahtuu?
vastaus
abs()
on määritelty kohdassa Arduino.h makrona:
#define abs(x) ((x)>0?(x):-(x))
Makro ei arvioi samalla tavalla kuin funktio.
sensor = abs(analogRead(A0) - 512);
Tämä käsky laajennetaan käännösaikaan:
sensor = ((analogRead(A0) - 512)>0?(analogRead(A0) - 512):-(analogRead(A0) - 512));
Nyt ”virhe” on helppo ymmärtää. Analoginen tappi luetaan kahdesti. Virheen voi välttää lisäämällä seuraava rivi luonnokseen ensin:
#undef abs
Tämä poistaa makron abs()
ja vakiokirjastofunktiota .
Kippis!
abs()
-makro Arduino.habs
jalabs
-toiminto. Arduinoabs
-makro on arduinon naurettava virhe. Aaron Ciuffo, napsauta linkkiä Arduino.h vastaukseen Mikael Patel, siellä näet muut makrot. Toinen asia on olla käyttämättä muuttujaa nimellä " B1 ".