以下のコードを使用してarduinoマイクロで0-5V信号を使用してA0からサンプリングすると、いくつかが得られます負の値。
int sensor = 0; sensor = abs(analogRead(A0) - 512);
値:
77 25 -74 -58 46 113 -74 102 -91 -51 -126 47 31
(明らかに)数学的に実行する場合以下の同等のコードは、もっぱら正の値を取得します。
int sensor = 0; sensor = analogRead(A0); sensor = sensor - 512; sensor = abs(sensor);
この投稿のように、これが整数オーバーフローではないと思います。 long sensor = 0
に切り替えると、同じ否定的な結果が得られます。
ここで何が起こっているのですか?
回答
abs()
は Arduino.h :
#define abs(x) ((x)>0?(x):-(x))
マクロは関数と同じように評価されません。
sensor = abs(analogRead(A0) - 512);
このステートメントは、コンパイル時に次のように展開されます。
sensor = ((analogRead(A0) - 512)>0?(analogRead(A0) - 512):-(analogRead(A0) - 512));
「エラー」は理解しやすいです。アナログピンは2回読み取られます。 「エラー」は、スケッチの最初に次の行を追加することで回避できます。
#undef abs
これにより、マクロabs()
と標準ライブラリ関数が使用されます。
乾杯!
abs()
マクロです。 Arduino.habs
とlabs
関数。 arduinoabs
マクロは、arduinoによるばかげた失敗です。 Aaron Ciuffo、Mikael Patelによる回答のArduino.hへのリンクをクリックすると、他のマクロが表示されます。もう1つは、" B1 "という名前の変数を使用しないことです。