我有一个函数filledFunction()
,它返回一个浮点filled
:
float filledFunction(){
if (FreqMeasure.available()) {
sum = sum + FreqMeasure.read();
count = count + 1;
if (count > 30) {
frequency = FreqMeasure.countToFrequency(sum / count);
a = frequency * x;
b = exp (a);
c = w * b;
d = frequency * z;
e = exp (d);
f = y * e;
float filled = c + f;
sum = 0;
count = 0;
return filled;
}
}
}
当我用
调用此函数时while (1){
fillLevel = filledFunction();
int tofill = 500 - fillLevel;
Serial.print("fillLevel: ");
Serial.println(fillLevel);
Serial.print("tofill: ");
Serial.println(tofill);
串行监视器应输出两个数字,最多可添加500个名为fillLevel
和tofill
的数字。相反,我得到了一个类似值的重复序列:
http://i.imgur.com/Y9Wu8P2.png
前两个值是正确的(410.93 + 89 = 500),但我不知道以下60个值,并且不属于那里。
我正在使用arduino nano
答案 0 :(得分:0)
filledFunction()
函数仅在FreqMeasure.available()
返回true
和count > 30
时才返回值。正如this question的答案中所述,C89,C99和C11标准都表示函数的默认返回值是未定义的(即如果函数在不执行return
语句的情况下完成)。这实际上意味着任何事情都可能发生,例如输出任意数字。
此外,您所看到的输出开始正确'其中一个数字从500
中减去,即使它们具有奇怪的值,例如11699.00
和-11199
(等于500 - 11699.00
)。然而,在输出中降低这似乎打破了,原因是在Arduino Nano上int
只能保持数字32767
,因此减法的结果太大而且&# 39;溢出'是一个很大的负数。
修复filledFunction()
函数,即使FreqMeasure.available()
为false
或count <= 30
,也要显式返回值,并确保它不能返回大于{的数字{1}}可能会解决这些问题。