아두 이노 마이크로에서 0-5V 신호로 A0에서 샘플링 할 때 아래 코드를 사용하여 abs () 함수의 예기치 않은 음수 값을 얻을 수 있습니다. 음수입니다.
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));
지금 “오류”는 이해하기 쉽습니다. 아날로그 핀은 두 번 읽 힙니다. “오류”는 스케치에서 먼저 다음 줄을 추가하여 방지 할 수 있습니다.
#undef abs
이렇게하면 매크로가 제거됩니다. abs()
및 표준 라이브러리 함수 가 대신 사용됩니다.
건배!
abs()
매크로입니다. Arduino.habs
및labs
함수. arduinoabs
매크로는 arduino의 우스꽝스러운 실수입니다. Aaron Ciuffo, Mikael Patel의 답변에서 Arduino.h 링크를 클릭하면 다른 매크로가 표시됩니다. 또 다른 방법은 " B1 "라는 이름의 변수를 사용하지 않는 것입니다.