Váratlan negatív értékek az abs () függvényből, analóg olvasással beolvasva

Ha az A0-ból 0-5V jelet veszünk mintát egy arduino mikro-n az alábbi kóddal, negatív értékek.

int sensor = 0; sensor = abs(analogRead(A0) - 512); 

Értékek:

77 25 -74 -58 46 113 -74 102 -91 -51 -126 47 31 

A (látszólag) matematikai futtatásakor ekvivalens kód alatt kapok kizárólag pozitív értékeket.

int sensor = 0; sensor = analogRead(A0); sensor = sensor - 512; sensor = abs(sensor); 

Nem hiszem, hogy ez egy egész szám túlcsordulás, mint ebben a bejegyzésben, mert amikor a long sensor = 0 -re váltok, ugyanazokat a negatív eredményeket kapom.

Mi folyik itt?

Válasz

abs() a Arduino.h makróként:

 #define abs(x) ((x)>0?(x):-(x)) 

A makró nem ugyanúgy értékel, mint egy függvény.

 sensor = abs(analogRead(A0) - 512); 

Ez az utasítás fordításkor kibővül a következőre:

 sensor = ((analogRead(A0) - 512)>0?(analogRead(A0) - 512):-(analogRead(A0) - 512)); 

Most a “hiba” könnyen érthető. Az analóg csapot kétszer olvassák fel. A “hiba” elkerülhető, ha a következő sort adja először a vázlatához:

#undef abs 

Ez eltávolítja a abs() és a szabvány könyvtár függvényt használják.

Egészségére!

Megjegyzések

  • A hiba a abs() makró Arduino.h
  • Köszönöm az egyértelmű választ. Fogalmam sem volt, hogy makrók még léteznek az Arduino világban. Találtam egy 2011-es bejegyzést , amely ezt és más makrók rövid listáját tárgyalja. Tudsz egy végleges listáról? Csupán több " Arduinoesque " és jobb gyakorlat, ha elkerüljük a sorban történő többszörös hozzárendelést, és soronként egy művelethez ragaszkodunk?
  • Nem, nem inkább arduinoesque, ha egy feladatban csak egy műveletet használunk. Néha ezt azért teszik, hogy megkönnyítsék az olvasást. A makrókkal kapcsolatos problémádnak nem sok köze van az Arduinóhoz. Általánosabban arról van szó, hogy a fordító hogyan értékeli a makrókat. A fordító a makrót lecseréli a benne leírtakra ' s definícióval (és beteszi az argumentumot). Ez nem függvény. És ez nem Arduino-specifikus, hanem a fordítótól függ. Makrókat is használhat, ha más fordítóval programoz. A makrók hasznosak lehetnek, de körültekintően kell használni őket.
  • @chrisl, már létezik abs és labs függvény. Az arduino abs makró nevetséges baklövés az arduino részéről. Aaron Ciuffo, kattintson az Arduino.h linkre Mikael Patel válaszában, ott látja a többi makrót. A másik dolog az, hogy ne használjunk " B1 " nevű változót.

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük